12

我尝试按照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 上运行。

本文提供了一种单独的方法:

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

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

但我也没有运气。

难道我做错了什么?这是一个错误吗?

4

3 回答 3

20

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

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

于 2010-08-26T21:30:27.787 回答
3

如果您想在对象保存在同一页面上的 localstorage 后执行某些操作,您可以在调用后手动调用该函数,localStorage.setItem并从storageeventlistener 调用相同的函数来处理多个选项卡。

于 2013-09-26T05:12:05.947 回答
1

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

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

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

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

于 2018-01-08T14:53:49.373 回答