html5存储事件,HTML 5本地存储之兼容性与存储监听

很早之前调研过HTML5的本地存储-《DOM Storage全解析》,大致上对localStorage、sessionStorage等API做了下了解,但是一直没有机会真正的在项目中使用。终于这次借重构Web IM的机会,对本地存储做了更深入的使用,除了基本的API使用之外还在次基础上封装了一些应用层的库,例如Tab之间的操作同步、Tab之间的请求同步等。本文主要做一个阶段性的经验总结。

一、localStorge onstorage事件的兼容性

1. 触发情况

IE8/IE9/Firefox3.6: 在页面A中注册onstorage事件,修改localStorage时,A页面和其他页面都能收到onstorage事件。因此,对于这些浏览器监听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 

//检查storage是否发生变化的时间间隔

interval: 1000

};

})();

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

【编辑推荐】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值