javascript globalStorage类代码

globalStorage

  这个也是html5中提出来,在浏览器关闭以后,使用globalStorage存储的信息仍能够保留下来,并且存储容量比IE的userdata大得多,一个域下面是5120k。和sessionStorage一样,域中任何一个页面存储的信息都能被所有的页面共享。

  作用域

  globalStorage['z.baidu.com'] 所有z.baidu.com下面的页面都可以使用这块空间

  globalStorage['baidu.com'] 所有baidu.com下面的页面都可以使用这块空间

  globalStorage['com']:所有com域名都可以 共享的使用这一块空间

  globalStorage[''] :所有页面都可以使用的空间

  现在Firefox只支持当前域下的globalStorage存储, 如果使用公用域会导致一个这样一个类似的错误“Security error” code: “1000”。

  过期时间

  按照HTML5的描述,globalStorage只在安全问题或者当用户要求时才会过期,浏览器应该避免删除那些正在被脚本访问的数据,并且userdata应该是用户可写的。

  因此我们的脚本要能够控制过期时间,可以在globalStorage的某个区域存储过期时间,在load的时候判断是否过期,可以在一定程度上解决过期时间的问题。

  存储时,同时存储过期时间

  以上是我从网上查询到的资料,为了兼容非IE浏览器“userdata”,我改进了之前我自己写的一个

  “userdata”(见 UserData使用总结) ,现在是兼容IE和支持globalStorage的浏览器了。

  

复制代码 代码如下:

  function behaviorUserdata(udObj)

  {

  var me = this;

  if(CMInfo.Bs_Name=='IE')    //IE下用userdata实现客户端存储

  {

  var loaded = '';    //当前已载入的文件名

  this.udObj = getObject(udObj);

  this.udObj.style.behavior = 'url(#default#userdata)';

  this.value = this.udObj.value;

  this.inhtml = this.udObj.innerHTML;

  //检查文件是否存在,存在est=undefined并返回true否则返回false

  this.exist = function(filename){

  try{

  me.udObj.load(filename);//将文件名为 filename的 XML 载入

  me.loaded = filename;

  return true;

  }catch(e){ return false;}

  }

  //预加载

  this.preLoad = function(filename){

  if(me.loaded=='' || me.loaded!=filename){me.exist(filename);}

  return me.loaded;

  }

  //获取指定的属性值

  this.getAtrib = function(filename,atrib){

  if(me.preLoad(filename)!='')

  {

  var val = me.udObj.getAttribute(atrib);

  return val==null?"":val;

  }return "";

  }

  //移除对象的指定属性

  this.remAtrib = function(filename,atrib){

  me.udObj.removeAttribute(atrib);

  me.udObj.save(filename);    //将对象数据保存到名为filename的XML文件里面

  return true;

  }

  //设置指定的属性值

  this.setAtrib = function(filename,atrib,val,expire){

  var etime = typeof(expire)=="undefined"?24*60*60:expire;

  me.udObj.expires = me.setExpire(etime);

  me.udObj.setAttribute(atrib,val);

  me.udObj.save(filename);

  }

  //设置一个系列的对象数据(即整个XML文件)失效

  this.remPartion = function(filename){

  if(me.exist(filename))

  {

  me.udObj.expires = me.setExpire(-1);

  me.udObj.save(filename);

  }

  }

  //设置有效期

  this.setExpire = function(sec){

  var oTimeNow = new Date();

  oTimeNow.setSeconds(oTimeNow.getSeconds() + parseInt(sec));

  return oTimeNow.toUTCString();

  }

  }else    //非IE下用globalStorage实现客户端存储

  {

  var domain = document.domain;

  //获取指定的属性值

  this.getAtrib = function(filename,atrib){

  var oTimeNow = new Date();

  var etime = parseInt(window.globalStorage[domain][filename + "__expire"]);

  if(!etime || etime < parseInt(oTimeNow.getTime()))

  {

  me.remPartion(filename);

  return '';

  }

  return window.globalStorage[domain][filename + "__" + atrib];

  }

  //移除对象的指定属性

  this.remAtrib = function(filename,atrib){

  try{window.globalStorage.removeItem(filename + "__" + atrib);}catch(e){}//删除

  return true;

  }

  //设置指定的属性值

  this.setAtrib = function(filename,atrib,val,expire){

  var etime = typeof(expire)=="undefined"?24*60*60:expire;

  window.globalStorage[domain][filename + "__expire"] = me.setExpire(etime);

  window.globalStorage[domain][filename + "__" + atrib] = val;

  }

  //设置一个系列的对象数据失效

  this.remPartion = function(filename){

  me.remAtrib(filename,"expire");

  return true;

  }

  //设置有效期

  this.setExpire = function(sec){

  var oTimeNow = new Date();

  oTimeNow.setSeconds(oTimeNow.getSeconds() + parseInt(sec));

  return oTimeNow.getTime();

  }

  }

  }

  其中CMInfo类见 一些常用的JS功能函数(一) (2009-06-04更新)

  需要说明的是因为还没用到实际项目中,因此还不知其兼容性和稳定性如何,如果网友发现了BUG,还望指出。谢谢