每次在Safari 5+中更新localStorage时,如何才能触发事件?

时间:2010-08-25 04:50:35

标签: html5 safari local-storage

我试图关注the examples on the Safari Developer Site

文档建议添加如下的事件监听器:

window.addEventListener('storage', storage_handler, false);

然后像这样设置处理函数:

function storage_handler(evt)
{
    alert('The modified key was '+evt.key);
    alert('The original value was '+evt.oldValue);
    alert('The new value is '+evt.newValue);
    alert('The URL of the page that made the change was '+evt.url);
    alert('The window where the change was made was '+evt.source);
}

但我似乎无法将此代码用于我的机器(OS X 10.6,Safari 5.01)以及iPhone 3GS(iOS 4.02)上的Safari。

This article提供了一个单独的方法:

window.onload = function() {
    ...
    document.body.setAttribute("onstorage", "handleOnStorage();");
}

function handleOnStorage() {
    if (window.event && window.event.key.indexOf("index::") == 0){
        $("stats").innerHTML = "";
        displayStats();
    }
}

但我也没有任何运气。

我做错了吗?这是一个错误吗?

3 个答案:

答案 0 :(得分:20)

在进一步调查之后(并在朋友的帮助下),我发现当我在当前窗口或选项卡中的页面上localstorage值的值发生更改时,不会调用storage_handler方法,而是在另一个选项卡中更改时。

例如,如果我打开了两个选项卡,并在每个选项卡的页面中有控件来更改localstorage设置,那么当我在第一个选项卡中点击控件时,将在另一个选项卡中调用storage_handler方法。 / p>

答案 1 :(得分:2)

如果要在对象保存在同一页面的localstorage中后执行某些操作,可以在调用localStorage.setItem后手动调用该函数,并从storage eventlistener调用相同的函数来处理多个标签。

答案 2 :(得分:0)

我意识到这是在询问Safari,但是,根据Mozilla开发者网络,只有在从页面外部更改Web存储对象时才会触发StorageEvent,例如,在另一个选项卡中。

https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API

向下滚动到"使用StorageEvent"响应存储更改。

(我会将此作为对已接受答案的评论添加,但我没有代表那个。)