前言
现在最流行的本地存储莫过于 cookie 的应用,但浏览器对 cookie 有很多限制,最大的限制在于其对cookie 总大小,仅为 4K 左右(包括名(name)、值(value)和等号)。
对于复杂一点的应用和需求,仅有的 4K 大小还是有点相形见绌,其实很多浏览器(IE、Firefox、Safari)本身也提供了自己的本地存储的功能,或许在特定的环境下能满足我们。
一、userData behavior
浏览器支持:IE5.0 或以上
基本语法:
- XML:<Prefix: CustomTag id=sID style=”behavior:url(‘#default#userData’)” />
- HTML:
<ELEMENT style=”behavior:url(‘#default#userData’)” id=sID>
object.style.behavior = “url(‘#default#userData’)” - Script: object.addBehavior (“#default#userData”)
属性:
- expires —— 设置或者获取 userData behavior 保存数据的失效日期。
- XMLDocument —— 获取 XML 的引用。
方法:
- getAttribute() —— 获取指定的属性值。
- load(object) —— 从 userData 存储区载入存储的对象数据。
- removeAttribute() —— 移除对象的指定属性。
- save(object) —— 将对象数据存储到一个 userData 存储区。
- setAttribute() —— 设置指定的属性值。
备注:
1、从安全方面考虑,一个 userData 存储区只能用于同一目录和对同一协议进行存储。
2、如果使用 userData behavior 不正确可能会对你的应用造成危害,userData 存储区中的数据没有加密因而不安全的。任何可以访问 UserData 保存磁盘的应用都可以访问该数据,所以,推荐不要保存敏感的数据,比如信用卡号,详细:《Security Considerations: DHTML and Default Behaviors》
3、userData behavior 会跨 session 存储信息到存储区,这提供了动态的数据结构和比 cookie(一般 4KB) 更大的容量。userData 存储区的容量依赖于 domain 的安全域。下表显示的是 userData 存储最大容量,对单独文档和整个域名的所有文档都适用,但基于安全域。
| Security Zone | Document Limit (KB) | Domain Limit (KB) |
|---|---|---|
| Local achine | 128 | 1024 |
| Intranet | 512 | 10240 |
| Trusted Sites | 128 | 1024 |
| Internet | 128 | 1024 |
| Restricted | 64 | 640 |
4、如果设置 userData behavior 到 html、head、title 或者 style 对象上,当 save 和 load 方法被调用时会出错。如果必须设置到 style 中,可以设置内联或者文档头,例如:
<style>
.storeuserData {behavior:url(#default#userData);}
</style>
5、对于 userData behavior 来说 ID 是可选的,但是如果有,则会改善执行性能。
6、userData 可以将数据以 XML 格式保存在客户端计算机上,一般保存在 C(WIN 系统盘):\Documents and Settings\XXX\UserData\ 文件夹下。
7、userData 数据一直存在,除非人为删除或者用脚本设置该数据的失效日期(expires)。
大部分翻译自:《userData Behavior》
witter:
共有14 条评论
[...] 256 人阅读。 您可以通过订阅 RSS 2.0 跟踪对这篇文章的评论, 也可以发表您的评论,或者在您自己的网站中 引用(trackback) [...]
学习了!文章写的不错
但是我在项目测试的时候火狐和opera浏览器并不支持userdate
@cary 已经注明了“浏览器支持:IE5.0 或以上”。对于Firefox的原生的本地存储,我会在下一篇中介绍,而opera暂时只能使用cookie
不错,cookies缺点太多,最大不能超过4096字节,而且每个域名下的cookies不能超过20个。这都是问题。
可以考虑用flash么,可以存100K。
@云谦 可以的,可以用 Flash Local Storage 来存贮。
希望看到 sessionStorage 和 globalStorage 的介绍。
我这里写了一个简单例子:
但是 userData 和 globalStorage 的功能差别很大。我只能做一点简单的兼容。
JObj.JStorage = {};
(function($){
var support = true;
var storage = null;
if(JObj.Browser.ie && JObj.Browser.version >= 5){
storage = JObj.$c(“JObjStorage”);
document.documentElement.insertBefore(storage,document.body);
storage.addBehavior(“#default#userData”);
}else if(window.globalStorage){
storage = window.globalStorage[location.hostname];
}else{
support = false;
}
$.getSupport = function(){
return support;
}
$.save = function(name){
if(JObj.Browser.ie)
storage.save(name);
}
$.load = function(name){
if(JObj.Browser.ie)
storage.load(name);
}
$.setAttribute = function(k,v){
JObj.Browser.ie ? storage.setAttribute(k,v) : storage.setItem(k,v);
}
$.getAttribute = function(k){
return JObj.Browser.ie ? storage.getAttribute(k) : storage.getItem(k);
}
$.removeAttribute = function(k){
JObj.Browser.ie ? storage.removeAttribute(k) : storage.removeItem(k);
}
$.setExpires = function(){
}
})(JObj.JStorage);
@xling 《跨浏览器的本地存储(二)》是准备讲sessionStorage 和 globalStorage 的^^
有个问题,ondownload事件必须放到body中去么,我使用的时候必须要有个alert事件才能正确打印出下载的文件,要不就没有出现,这是为什么呢?
下面是我的代码:
function onDownloadDone(downData) {
//document.write(”+downData+”);
load_call_records(downData);
document.write(”);
document.write(”);
document.write(”);
//document.write(‘< Pre ‘+current_page+’ of 5 Next >‘);
document.write(”);
return;
}
oDownload1.startDownload(‘../test1.env.bak’,onDownloadDone);
alert(oDownload1);
其中load_call_records()是将下载的记录文件按一定格式打印到一个表格中,因为要分页显示,innerHtml不好实现
@dave 没完全明白你的意思,是否有演示页面?
就是说我这里使用behavior必须要alert一下才能正确显示,不知道有什么办法能去掉这个alert?
不好意思,没有演示页面,在嵌入式环境下的
就用了javascript,不过整个页面都是document.write出来的
楼上说的还是不太清楚,也许我没理解好