4

Chrome 的 localStorage 实现的错误?很好地解释了规范,以及它在 Opera 和 IE9 中的行为方式有何不同。

但是,现在呢?

这真的会弄乱我的代码(任何代码),它依赖于实现在浏览器上的一种方式,当它是另一种方式时。

如何测试以了解事件是否在调用它的窗口上触发?

我唯一能想到的是使用 setTimeout() 来等待并查看事件是否在调用它的窗口中触发,如果没有,则执行某些操作。但是,当存储事件被快速连续调用时,这可能会产生一些可怕的错误。

在我的情况下,我需要为所有窗口触发事件,而不是所有窗口,而是调用它的窗口。在按照规范正确实现它的 Chrome 中,这只是在添加到 localStorage.setItem() 之后添加一个额外函数的问题,但是在 IE、Firefox3.6 和 Opera 中,它会有效地执行两次。我也可以有基于浏览器的不同代码,但我应该测试兼容性而不是浏览器版本。

有没有办法“修补”所有具有 localStorage 支持的浏览器,以使事件在所有浏览器上都以相同的方式处理?

4

2 回答 2

1

我解决了我自己的问题

var localStorageSpecCompliant = true;
var specCompliantTestVal = new Date().getTime();
function onStorage(ev) {
    if( ev.key == "specCompliantTest"+specCompliantTestVal ){
        localStorageSpecCompliant = false;
    }
    localStorage.removeItem("specCompliantTest"+specCompliantTestVal);
};
if( window.addEventListener ){  
    window.addEventListener("storage", onStorage, false);  
} else { window.attachEvent("onstorage", onStorage); }

localStorage["specCompliantTest"+specCompliantTestVal] = "This tests if the browsers localStorage storage event is spec compliant or ont.";

localStorage_setItem = function(key, value){
    localStorage[key] = value;
    if( localStorageSpecCompliant ){
        var dirtyFakeEvent = {"key":key, "newValue":value};
        onStorage(dirtyFakeEvent);
    }
}

但是某种总是使事件工作相同的补丁会好得多。这种方式并不理想。我不知道如何伪造真正的“存储”事件,所以我直接调用了该函数。

一个简单地修复合规性的框架会很棒。我对 IE7 中不存在的 localStorage 没有问题。但是在一个或另一个浏览器中完全不同的功能,不同于规范,是非常有问题的。

于 2012-05-13T16:52:56.373 回答
0

我对此很好奇,看了几个js存储库。到目前为止,我发现支持存储事件的是 YUI 2 Storage Utility。看看它是否可以规范跨浏览器的行为会很有趣。还有一个基于 YUI3 的库,看起来很有趣,并宣传了一个更改事件和一个存储就绪事件。

YUI 2 存储

基于 YUI 3 的 Storage Lite

这些可能涉及比您想要的更多的依赖项。他们还可以提供学习如何更简单地解决问题的方法。

这些库还解决了如何处理不提供 HTML5 样式存储的浏览器的问题。

于 2012-05-13T00:33:27.827 回答