如何使用jQuery绑定到所有浏览器的localStorage更改事件?
如何使用jQuery将函数绑定到HTML5 localStorage更改事件?
$(function () { $(window).bind('storage', function (e) { alert('storage changed'); }); localStorage.setItem('a', 'test'); });
我已经尝试了以上,但警报没有显示。
更新 :它在Firefox 3.6中工作,但在Chrome 8或IE 8中不起作用,所以问题应该更多'如何使用jQuery绑定到所有浏览器的localStorage更改事件?
事实certificate,这实际上工作正常,我误解了规范
当在与本地存储区域关联的存储对象x上调用setItem(),removeItem()和clear()方法时,如果方法做了某事,那么在每个Document对象的Window对象的localStorage属性的Storage对象是与x相同的存储区域关联,则必须激发存储事件
换句话说, 除了更新localStorage
对象并导致事件的窗口之外 ,每个窗口/选项卡上都会触发存储事件。
所以这个事件并没有被解雇,因为我只打开了一个窗口/标签。 如果我将上面的代码放在一个页面中,并打开两个选项卡中的页面,我会看到在第二个选项卡中触发的事件。
这个问题的答案包含更多的细节。
以下是如何在JQuery中完成的:
$(window).bind('storage', function (e) { console.log(e.originalEvent.key, e.originalEvent.newValue); });
直接访问e.key
不起作用,您需要使用e.originalEvent.key
。
一些浏览器只发送存储通知到其他标签,有些则不会。 (Firefox会发送存储事件到自己的标签,但是key
设置为空,看起来像)。
有一点要提到的是事件处理程序只在.setItem
上.setItem
如果该项目实际更改。 我试图让这个工作,直到我意识到你不能继续运行setItem具有相同的价值。
我在Chrome版本54.0.2840.71米
这是一个testing(在两个浏览器标签中打开)。
if (window.addEventListener) addEventListener('storage', storage_event, false); else if (window.attachEvent) attachEvent('onstorage', storage_event, false); function storage_event(e) { console.log("Time is now "+ e.newValue); } setInterval(function () { var time=new Date().getTime(); localStorage.setItem("time", time); console.log("Setting time to "+time); }, 1000)
只要键值发生变化(例如set或remove方法所做的更改),就可以使用localDataStorage这样的实用程序在同一个窗口/选项卡中为您触发事件。 您也可以使用它透明地设置/获取以下任何“types”:Array,Boolean,Date,Float,Integer,Null,Object或String。
[免责声明]我是实用程序的作者[/免责声明]
一旦你实例化该实用程序,下面的代码片段将允许你监视事件(在香草JS中,因为jQuery示例已经给出):
function localStorageChangeEvents( e ) { console.log( "timestamp: " + e.detail.timestamp + " (" + new Date( e.detail.timestamp ) + ")" + "\n" + "key: " + e.detail.key + "\n" + "old value: " + e.detail.oldval + "\n" + "new value: " + e.detail.newval + "\n" ); }; document.addEventListener( "localDataStorage" , localStorageChangeEvents , false );