11

从许多来源中,我发现本地存储事件仅在不引发更改的窗口/选项卡中触发。

我的问题是,有什么方法可以从同一个窗口检测到变化?或者可能覆盖强制事件在同一个窗口/选项卡内触发的功能?

不包括该选项似乎不切实际,但我找不到办法。

谢谢

4

3 回答 3

2

仅供参考,这就是我最终得到的。

localStorage.setItem('selectedOrgs', JSON.stringify(this.selectedOrgs));

// trigger the event manually so that it triggers in the same window
// first create the event
var e = $.Event("storage");

// simulate it being an actual storage event
e.originalEvent = {
    key: 'selectedOrgs',
    oldValue: prev,
    newValue: JSON.stringify(this.selectedOrgs)
};

// Now actually trigger it
$(window).trigger(e);

注意:我只使用 oldValue 和 newValue.. 如果您使用其他属性,请确保并正确设置它们。

您还可以覆盖 localStorage.setItem 以便它以类似的方式在当前窗口中触发。

于 2014-08-28T21:40:16.887 回答
0

是的,您可以为每个选项卡生成唯一 ID 并进行比较,看看这家伙是怎么做 的 基于相同想法的另一个解决方案,生成并比较唯一 ID ..这里

于 2014-02-10T22:39:46.487 回答
0

这可以通过localDataStorage轻松处理,您可以在其中透明地设置/获取以下任何“类型”:Array、Boolean、Date、Float、Integer、Null、Object 或 String。当然,它还会在同一窗口/选项卡中触发键值更改的事件,例如由 set 或 remove 方法进行的更改。

[免责声明] 我是该实用程序的作者 [/DISCLAIMER]

实例化该实用程序后,以下代码段将允许您监视事件:

function nowICanSeeLocalStorageChangeEvents( e ) {
    console.log(
        "subscriber: "    + e.currentTarget.nodeName + "\n" +
        "timestamp: "     + e.detail.timestamp + " (" + new Date( e.detail.timestamp ) + ")" + "\n" +
        "prefix: "        + e.detail.prefix  + "\n" +
        "message: "       + e.detail.message + "\n" +
        "method: "        + e.detail.method  + "\n" +
        "key: "           + e.detail.key     + "\n" +
        "old value: "     + e.detail.oldval  + "\n" +
        "new value: "     + e.detail.newval  + "\n" +
        "old data type: " + e.detail.oldtype + "\n" +
        "new data type: " + e.detail.newtype
    );
};
document.addEventListener(
    "localDataStorage"
    , nowICanSeeLocalStorageChangeEvents
    , false
);
于 2017-11-08T20:13:06.370 回答