2012-05-12 61 views
4

Bug with Chrome's localStorage implementation?很好地解释了规范,以及它在Opera和IE9中的表现方式。如何解决浏览器之间不同的“存储”事件行为?

但是,现在呢?

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

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

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

在我的情况下,我需要所有窗口的事件触发,不是所有的窗口都打电话给它。在Chrome中,按照规范正确实现它,这只是添加到localStorage.setItem()后添加额外功能的问题,但在IE,Firefox3.6和Opera中它将有效地做到两次。我也可以有不同的基于浏览器的代码,但我应该测试兼容性而不是浏览器版本。

有没有办法用localStorage支持“修补”所有的浏览器,让它们都以相同的方式处理它们?

+1

看起来像一次“开始”写入包含唯一标识的密钥的兼容性测试是可能的,例如,一个时间戳,然后记录它何时返回。如果事件没有回来,那么您的代码应该继续,并在更改存储时在本地启动它。否则,绕过该逻辑。这里粗略的想法...不是答案。 – joshp

+1

是的。我也在考虑这一点,但我也属于“可能有问题而且不是很好的做法”。我认为这个解决方案需要类似于那些在没有它的情况下为浏览器添加JSON解析和stringify支持的补丁,但是在这种情况下会覆盖localStorage事件。不过,我不知道从哪里开始做这样的事情。我甚至不知道如何查看当前代码的外观,或者找出我甚至需要覆盖哪些函数,如果这甚至是可能的话。 – sadtaco

+0

当你与猪搏斗(任性的浏览器)时,你会变脏。如果一个库不存在,编写这样的库会很有趣。问题是什么是最好的能力测试。如果我找到答案,我会发布答案。 – joshp

回答

0

我对此很好奇,看了几个js存储库。我发现迄今为止支持存储事件的是YUI 2存储实用程序。看看它是否正常化了跨浏览器的行为会很有趣。还有一个基于YUI3的库,它看起来很有趣,并且宣传一个变更事件和一个存储准备事件。

YUI 2 Storage

YUI 3 based Storage Lite

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

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

+0

当我已经使用jQuery和下划线时,我不愿意添加另一个库。该API虽然看起来没问题。看起来它包括一个跨窗口事件,当存储被改变时,这在这里有点问题。尽管如此,我更喜欢简单地使用localStorage。我回头看了一个类似jQuery的插件,并没有留下深刻的印象。 – sadtaco

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的问题。但是,功能在一个浏览器或另一个浏览器中完全不同,与规范不同,因此存在问题。

相关问题