某些复杂情况下,多个网页、标签页或者 Worker 都需要访问存储的数据。此时,应用程序可能会在存储数据被修改后触发一系列操作。对于这种情况, Web Storage 内建立了一套事件通知机制,它可以将数据更新通知发送给监听者。无论监听窗口本身是否存储过数据,与执行存储操作的窗口同源的每个窗口的 window 对象上都会触发 Web Storage 事件。
window.addEventListener('storage', displayStorageEvent, true);
其中事件类型参数是 storage ,这样只要有同源的 Storage 事件发生(包括 SessionStorage 和 LocalStorage 触发的事件),已注册的所有事件侦听器作为事件处理程序都会接收到相应的 Storage 事件。
interface StorageEvent : Event {
readonly attribute DOMString key;
readonly attribute any oldValue;
readonly attribute any newValue;
readonly attribute DOMString url;
readonly attribute Storage storageArea;
}
StorageEvent 对象是传入事件处理程序的第一个对象,包含了与存储变化有关的所有必要信息。
key 属性包含了存储中被更新或删除的键。 oldValue 属性包含了更新前键对应的数据, newValue 属性包含更新后的数据。如果是新添加的数据,则 oldValue 属性值为 null ,如果是被删除的数据, newValue 属性值为 null 。 url 属性指向 Storage 事件发生的源。 storageArea 属性是一个引用,它指向值发生改变的 1ocalStorage 或 sessionStorage 对象,如此一来,处理程序就可以方便地查询到 Storage 中的当前值,或基于其它 Storage 的改变而执行其它操作。
使用的存储区域发生变化时还可能触发 storage 事件,使用 window.onstorage 可以捕捉该事件。例如下面的代码:
// 定义事件函数,监听存储区域变化
function storageHandler(event) {
var myDiv = document.getElementById('myDiv');
myDiv.innerHTML =
' 存储发生了变化: <b> ' +
event.key +
'</b>键改变了 旧值 <b> ' +
event.oldValue +
'</b>被改变为新值 <b> ' +
event.newValue +
'</b> 发生更改所在的网址: <b> ' +
event.url +
'</b> ';
}
window.onstorage = storageHandler;
如果目标文档当前不处于活动状态,那么该事件不会被触发。 Storage.setItem() 、 Storage.removeItem() 和 Storage.clear() 方法都可以触发该事件。
事件对象可以获取如下属性:
IE 使用 storageCommit 事件代替 storage 事件,它使用 XML 文件存储 localStorage ,当 localStorage 被写到磁盘时,该事件被触发。 Storage.setItem() 、 Storage.removeItem() 和 Storage.clear() 方法都可以触发该事件。为了提高性能, localStorage 是异步进行的,该事件可以用来判断磁盘存储空间是否被更新。