如何在 ie6 中使用 "localStorage"
好吧,我只是个标题党,ie6 下根本无法使用跟 h5 沾边的 localStorage。今天要向大家介绍的是 ie 特有的 userData 的存储方式,并且对它进行封装,使得不支持 localStorage 的浏览器能像使用 localStorage 一样使用 userData。
userData
在 IE5.0 中,微软通过一个自定义行为引入了持久化用户数据的概念。用户数据允许每个文档最多 128KB 数据,每个域名最多 1MB 数据。要使用持久化用户数据,首先必须如下所示,使用 CSS 在某个元素上指定 userData 行为:
<div style='behavior:url(#default#userData)' id='dataStore'></div>
一旦元素使用了 userData 行为,那么就可以使用 setAttribute() 方法在上面保存数据了。为了将数据提交到浏览器缓存中,还必须调用 save() 方法并告诉它要保存到的数据空间的名字(任意取):
var dataStore = document.getElementById('dataStore');
dataStore.setAttribute('name', 'zichi');
dataStore.save('personInfo');
下次页面载入之后,可以使用 load() 方法指定同样的数据空间名称来获取数据:
var dataStore = document.getElementById('dataStore');
dataStore.load('personInfo');
alert(dataStore.getAttribute('name'));
对 load() 的调用获取了 personInfo 数据空间的所有信息,并且使数据可以通过元素访问。只有在载入确切完成之后数据才能使用。如果 getAttribute() 调用了不存在的名称或者是尚未载入的名称,则返回 null。
我们可以通过 removeAttribute() 方法删除某元素数据,删除之后用 save() 来提交更改:
dataStore.removeAttribute('name');
dataStore.save('personInfo');
与 localStorage 不同的是,userData 有个 expires 属性,顾名思义能设置过期时间。
var dataStore = document.getElementById('dataStore');
dataStore.setAttribute('name', 'zichi');
var expires = new Date();
expires.setSeconds(expires.getSeconds() + 1); // 设置为 1 秒后过期
dataStore.expires = expires.toUTCString();
dataStore.save('personInfo');
// 2 秒后查看结果
setTimeout(function() {
var dataStore = document.getElementById('dataStore');
dataStore.load('personInfo'); // 如果不 load 会 alert 'zichi'
alert(dataStore.getAttribute('name')); // null
}, 2000);
userData 封装
一般的客户端存储,如果支持 localStorage 的话会优先使用 localStorage,碰到一些低版本的 ie 则会使用 userData,需要根据浏览器进行判断选择,如果能把 userData 的 api 封装成 localStorage 的 api 就方便多了。
localStorage 一般使用较多的 api 有 setItem()、getItem()、romoveItem() 以及 clear()。我们把 userData 的使用方式也封装成这些 api。主要思路是把 key-value 键值对都绑在 body 标签中,每个键值对采用一个数据空间存储,数据空间的名字也用 key 值。另外为了照顾 clear() api,还需要把每个 key 值的信息存到另外一个元素标签中,这里用了 html 标签进行存储。(因为用了 body 和 html 标签做宿主,所以以下的 js 需引入在 body 元素后,千万不能引入在 head 中)
!window.localStorage && function() {
window.localStorage = {};
var prefix = 'data-userdata'
, body = document.body
, html = document.documentElement
, mark = function(key, isRomove) { // key 值字符串
try {
html.load(prefix);
var tmp = html.getAttribute(prefix);
tmp = !tmp ? '' : tmp;
} catch(e) {
tmp = '';
}
var reg = tmp.indexOf(key) === 0 ? new RegExp('\\b' + key + '\\b,?', 'i') : new RegExp(',?\\b' + key + '\\b', 'i')
, hasKey = reg.test(tmp) ? true : falocalStoragee;
tmp = isRomove ? tmp.replace(reg, '') : hasKey ? tmp : tmp === '' ? key : tmp.split(',').concat(key).join(',');
html.setAttribute(prefix, tmp);
html.save(prefix);
};
body.addBehavior('#default#userData');
html.addBehavior('#default#userData');
// getItem()
localStorage.getItem = function(key) {
try {
body.load(key);
return body.getAttribute(key);
} catch(e) {
return null;
}
};
// setItem()
localStorage.setItem = function(key, value) {
body.setAttribute(key, value);
body.save(key);
mark(key, false);
};
// removeItem
localStorage.removeItem = function(key) {
body.removeAttribute(key);
body.save(key);
mark(key, true);
};
// clear()
localStorage.clear = function() {
try {
html.load(prefix);
var attrs = html.getAttribute(prefix).split(',')
, len = attrs.length;
for (var i = 0; i < len; i++) {
body.removeAttribute(attrs[i]);
body.save(attrs[i]);
}
html.setAttribute(prefix, '');
html.save(prefix);
} catch(e) {
}
};
}();
如何在 ie6 中使用 "localStorage"的更多相关文章
- 我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧
做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...
- 如何在latex 中插入EPS格式图片
如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...
- 如何正确的使用json?如何在.Net中使用json?
什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...
- [原创]如何在Parcelable中使用泛型
[原创]如何在Parcelable中使用泛型 实体类在实现Parcelable接口时,除了要实现它的几个方法之外,还另外要定义一个静态常量CREATOR,如下例所示: public static cl ...
- 如何在springMVC 中对REST服务使用mockmvc 做测试
如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试 spring 集成测试中对mock 的集成实在是太棒了!但 ...
- 如何在tomcat中如何部署java EE项目
如何在tomcat中如何部署java EE项目 1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的一种Tomcat项目部署的方法,也是初学者最常用的方法.2.在tomcat安 ...
- 【转】我是如何在SQLServer中处理每天四亿三千万记录的
原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...
- 如何在JAVA中实现一个固定最大size的hashMap
如何在JAVA中实现一个固定最大size的hashMap 利用LinkedHashMap的removeEldestEntry方法,重载此方法使得这个map可以增长到最大size,之后每插入一条新的记录 ...
随机推荐
- React-Native测试报告
React-native 使用js编写android和ios程序,前端时间开始支持android,本人根据官方的教程,先安装开发环境,然后运行hello world,最后看了下官方提供的实例程序UI ...
- shell流程控制&函数
条件 if-then-elif-then-fi if的条件部分经常使用test EXPRESSION或[ EXPRESSION ]实现,test的用法可以参见test if 条件1 #if 条件1;t ...
- 注解学习(模仿springMvc的注解注入方式)
最近在看springMvc的源码,看到了该框架的注入注解的部分觉的有点吃力,可能还是对注解的方面的知识还认识的不够深刻,所以特意去学习注解方面的知识.由于本人也是抱着学习的态度来阅读源码,若文章在表述 ...
- Linux磁盘管理之元数据、文件和目录、链接文件03
一.存储设备分区简述 文件系统最终目的是把大量数据有组织的放入持久性的存储设备,如硬盘.硬盘存储能力具有持久性,不会因为断电而消失,存储量大,但读取速度慢.操作系统读取硬盘的时候,不会一个一个扇区读取 ...
- Ubuntu下安装Pyenv不成功,求指教
虚拟机:VMware12.0 操作系统:Ubuntu16.04 LTS (新安装系统) 已经按照网上的步骤: 1.安装git: $sudo apt-get install git 2.安装依赖包: $ ...
- MAC中设置java环境变量和MAVEN
借助于/usr/libexec/java_home进行配置 在~/.bash_profile 或者/.bash中添加(这里添加1.7版本) #JAVA_HOME export JAVA_HOME=$( ...
- 准备使用 Office 365 中国版--邮箱迁移
微软产品一贯的作风是从来不缺文档和教程,Office 365也不例外.无论是最终用户还是企业IT管理员,都可参照Office 365使用指南顺利的开启Office 365之旅.不过比较奇怪的是,貌似很 ...
- IE自动跳转到标准模式
<meta http-equiv="X-UA-Compatible" content="IE=edge">
- html5语法
html5语法沿用html语法,但更简单,更人性化. 一.DOCTYPE及字符编码 DOCTYPE:<!doctype html>或者<!DOCTYPE html>因为html ...
- MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。
http://blog.csdn.net/tianyu0910/article/details/6260755 http://blog.sina.com.cn/s/blog_4e4ee8ed0100e ...