HTML5本地存储之兼容性与存储监听

  

  很早之前调研过HTML5的浏览器监听onstorage时需要自己判断是否是本页面触发的,并且忽略本页面触发的行为。

  Chrome12/Firefox4/Opera11/Safari5中只有收到由其他页面触发的onstorage事件。

  此外,Chrome14 DEV版本中测试发现,在页面设置了document.domain之后,onstorage事件无论如何都不会触发,此Bug导致在Chrome下无法使用onstorage事件。

  2. 事件注册

  IE需要注册在document上,其他均注册在window上。

  JavaScript Code复制内容到剪贴板

  //IE注册在document上   if(document.attachEvent&&!K.Browser.opera){   document.attachEvent("onstorage",_onstorage(key,callback));   }   //其他注册在window上   else{   window.addEventListener("storage",_onstorage(key,callback),false);   };

  3. 事件对象

  IE中的storageEvent对象不包含key/newValue/oldValue等属性,因此如果想知道是哪个Key的数据发生了变化需要自己处理,其他浏览器则可以直接获得数据。

  4. 数据的获取

  IE9下在事件触发时尽然无法立即获取到对应key的值,需要使用setTimeout做异步处理。其他浏览器状况良好。

二、监听某个Key的变化

  监听某个key也就是在onstorage的基础上更精细一些,这是之后各种应用的基础。以下为实现方案:

  1. onstorage可用时,监听事件并在事件触发时判断是否指定的key

  2. onstorage不可用(IE8以下、Chrome因domain问题)时使用Timer来检查

  JavaScript Code复制内容到剪贴板

  varLocalStorage=(function(){   varls=window.localStorage;      function_onstorage(key,callback){   varoldValue=ls[key];   /*   IE下即使是当前页面触发的数据变更,当前页面也能收到onstorage事件,其他浏览器则只会在其他页面收到   */   returnfunction(e){   //IE下不使用setTimeout尽然获取不到改变后的值?!   setTimeout(function(){   e=e||window.storageEvent;      vartKey=e.key,   newValue=e.newValue;   //IE下不支持key属性,因此需要根据storage中的数据判断key中的数据是否变化   if(!tKey){   varnv=ls[key];   if(nv!=oldValue){   tKey=key;   newValue=nv;   }      }      if(tKey==key){   callback&&callback(newValue);      oldValue=newValue;   }   },0);   }   }   return{   getItem:function(key){   returnls.getItem(key);   },   setItem:function(key,val){   returnls.setItem(key,val);   },   removeItem:function(key,val){   returnls.removeItem(key);   },   clear:function(){   returnls.clear();   },   onstorage:function(key,callback){   //IE6/IE7/Chrome使用Timer检查更新,其他使用onstorage事件   /*   Chrome下(14.0.794.0)重写了document.domain之后会导致onstorage不触发   鉴于onstorage的兼容性问题暂时不使用onstorage事件,改用传统的轮询方式检查数据变化   */   varb=K.Browser;      if(!this.useTimer){   //IE注册在document上   if(document.attachEvent&&!K.Browser.opera){   document.attachEvent("onstorage",_onstorage(key,callback));   }   //其他注册在window上   else{   window.addEventListener("storage",_onstorage(key,callback),false);   };   }   else{   /*   Timer检查方式   */   varlistener=_onstorage(key,callback);   setInterval(function(){   listener({});   },this.interval);   }   },   //是否使用Timer来check   useTimer:(K.Browser.ie&&K.Browser.ie<8)||(K.Browser.chrome),   //检查storage是否发生变化的时间间隔   interval:1000   };   })();

  以上是LocalStorage接口的完整封装,在localStorage不可用时使用UserData等其他替代方案来实现以上的接口即可。

松树亭亭玉立的耸立在周围小草小花的中间,

HTML5本地存储之兼容性与存储监听

相关文章:

你感兴趣的文章:

标签云: