提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

上次我们提到了本地存储的一个方式,那就是Cookie,不过遗憾的是Cookie保存的数据量非常小,更详细的可以参考 《在 Internet Explorer 中的 cookie 的数字和大小限制》 ,而且我们还要冒着用户禁用Cookie的风险,那么有没有变通的方法呢,微软为我们提供了一个类似的功能userData来帮助我们实现本地存储。

浏览器支持 : 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() 设置指定的属性值。

要使用userData存储功能,必须先建立一个HTML标签,然后将behavior:url('#default#userData')样式属性加上去,等于说userData是寄存于HTML标签的,当然不是所有标签都是可以的,仅限于部分标签。要了解更多的信息可以访问MSDN的 《userData Behavior》

下面我们基于先前讲解的IStorage接口,实现UserData这个类。

var UserData = function() {
  this.userData = null;
  this.name = location.hostname;
  //this.name = "wangye.org";
  
  if (!this.userData) {
    try {
      this.userData = document.createElement('INPUT');
      this.userData.type = "hidden";
      this.userData.style.display = "none";
      this.userData.addBehavior ("#default#userData");
      document.body.appendChild(this.userData);
      var expires = new Date();
      expires.setDate(expires.getDate()+365);
      this.userData.expires = expires.toUTCString();
    } catch(e) {
    }
  }
  
  this.setItem = function(key, value) {
    this.userData.load(this.name);
    this.userData.setAttribute(key, value);
    this.userData.save(this.name);
  }
  
  this.getItem = function(key) {
    this.userData.load(this.name);
    return this.userData.getAttribute(key);
  }
  
  this.remove = function(key) {
    this.userData.load(this.name);
    this.userData.removeAttribute(key);
    this.userData.save(this.name);
  }
}

在这里我有必要说明一下,this.name这里指定了userData存储文件的文件名,这里我们指定为location.hostname,不过大家在本地测试时可能会遇到location.hostname为空的情况,这样会导致下面的脚本执行出错,因为不能指定一个空文件名,这时我们可以硬编码个文件名供我们测试。接下来我们通过createElement动态创建一个input元素作为我们userData的宿主,然后设置过期时间,这点类似于Cookie的过期时间,我们设置为当前时间+365天。接下来就可以通过load加载,然后对键值进行相关操作,然后再save了。

关于UserData这个类的具体操作和先前讲的Cookie一样,这里就不举例了。