起初我想使用 storage-event,但正如你看到的这个问题- 和这个问题,以及html5demos.com 上的这个演示,使用 storage 事件的目的是跟踪窗口/选项卡之间的 localstorage 的变化,而不是文档本身。
但是您可以创建自己的事件,在setItem
通过覆盖 setItem 调用时触发:
//create an "onstoragechange" custom event
var storageEvent = document.createEvent('Event');
storageEvent.initEvent('onstoragechanged', true, true);
document.addEventListener('onstoragechanged', function (e) {
alert('value added to localstorage');
//or
alert(localStorage.getItem('test'));
//call the code here, as you above would do after setTimeout
//"callback.call(self);" or whatever
}, false);
//override localStorage.setItem
var oldSetItem = Storage.prototype.setItem;
Storage.prototype.setItem = function() {
oldSetItem.apply(this, arguments);
document.dispatchEvent(storageEvent);
}
//test
localStorage.setItem('test', 'value');
演示/jsfiddle:http://jsfiddle.net/cYLHT/
现在,您每次将任何内容保存到 localStorage 时都会调度一个事件,并且写入的值实际上是存在的。使用有助于您的应用程序的事件来扩展它——比如更新/存储某个重要密钥时的特殊事件。以上似乎可能是一个“离题”的答案,或者是矫枉过正,但我认为这是一种比在代码中传播 setTimeouts 更好的方法。