前言

现在最流行的本地存储莫过于 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>
  • Script:
    object.style.behavior = “url(‘#default#userData’)”
    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》



共有15 条评论

  1. 1. 跨浏览器的本地存储 | 搜我收藏

    […] 256 人阅读。 您可以通过订阅 RSS 2.0 跟踪对这篇文章的评论, 也可以发表您的评论,或者在您自己的网站中 引用(trackback) […]

  2. 2. 头像 转换

    学习了!文章写的不错

  3. 3. 头像 cary

    但是我在项目测试的时候火狐和opera浏览器并不支持userdate

  4. 4. 头像 怿飞

    @cary 已经注明了“浏览器支持:IE5.0 或以上”。对于Firefox的原生的本地存储,我会在下一篇中介绍,而opera暂时只能使用cookie

  5. 5. 头像 猴子

    不错,cookies缺点太多,最大不能超过4096字节,而且每个域名下的cookies不能超过20个。这都是问题。

  6. 6. 头像 云谦

    可以考虑用flash么,可以存100K。

  7. 7. 头像 怿飞

    @云谦 可以的,可以用 Flash Local Storage 来存贮。

  8. 8. 头像 xling

    希望看到 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);

  9. 9. 头像 怿飞

    @xling 《跨浏览器的本地存储(二)》是准备讲sessionStorage 和 globalStorage 的^^

  10. 10. 头像 dave

    有个问题,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不好实现

  11. 11. 头像 怿飞

    @dave 没完全明白你的意思,是否有演示页面?

  12. 12. 头像 dave

    就是说我这里使用behavior必须要alert一下才能正确显示,不知道有什么办法能去掉这个alert?

    不好意思,没有演示页面,在嵌入式环境下的

  13. 13. 头像 dave

    就用了javascript,不过整个页面都是document.write出来的

  14. 14. 头像 股吧

    楼上说的还是不太清楚,也许我没理解好

  15. 15. 头像 donnie

    你好!我想利用userData行为实现自动存储多条表单数据。代码如下:

    .userData {behavior:url(#default#userdata);}

    function dataSave(ele)
    {
    var obj=document.getElementsByName(ele)[0];
    obj.setAttribute(‘contact’+ele,obj.value);
    obj.save(“contact”);
    }
    function dataLoad()
    {
    var obj=document.all.contact.id;
    obj.load(“contact”);
    var val = obj.getAttribute(“contact”+”id”);
    if(val == null)
    obj.val = “”;
    else obj.value= val;

    var obj=document.all.contact.name;
    obj.load(“contact”);
    val = obj.getAttribute(“contact”+”name”);
    if(val == null)
    obj.val = “”;
    else obj.value= val;
    }

    编号:
    名称:

    问题是:每次只能存储一条数据,后一次输入的数据都会覆盖前一次的输入。望请教,不甚感激!

发表评论

(必填)

(必填,会为您保密)

评论仅支持“a、abbr、strong、em、blockquote、code”几个简单的标签