javascript – Chrome的localStorage实现错误? - 代码日志

javascript – Chrome的localStorage实现错误?

this question之后,当将功能绑定到Chrome 8.0.552.224中的Storage对象的更改事件时,我会获得好奇的结果。

考试:

<!DOCTYPE html>
<html>
  <head>
    <title>Chrome localStorage Test</title>
    <script type="text/javascript" >

      var handle_storage = function () {
        alert('storage event');
      };

      window.addEventListener("storage", handle_storage, false);

    </script>
  </head>
  <body>
    <button id="add" onclick="localStorage.setItem('a','test')">Add</button>
    <button id="clear" onclick="localStorage.clear()">Clear</button>
  </body>
</html>

>在两个Chrome窗口中打开页面,一个带有两个选项卡的窗口,
>点击“添加”按钮

当我这样做,我得到一个警报框显示在第二个选项卡上和第二个窗口,但不是在调用事件的选项卡(我点击)。据了解,我应该看到三个警报框(每个标签打开一个)。

这是一个错误?有没有人得到这个行为?如果不是你运行什么版本?或者我只是把这一切都完全错了?

更新和最终结论

事实证明,该规范实际上表示这是所需的行为,因此IE9的实现被打破了。

4.2 The sessionStorage attribute

When the setItem(), removeItem(), and clear() methods are called on a Storage object x … if the methods did something, then in every HTMLDocument … [that is] associated with the same storage area, other than x, a storage event must be fired….

所以我们可以看到,这个规范做得很清楚,这是指定的行为。这就是Opera 10的实施被打破的原因,也很可能是IE9的实现被打破的原因。

我们从中学到什么?总是阅读规范中的每一个单词(特别是如果你正在实现的东西…)。

老回答

正如你所说的,这里的基本行为是“只在当前页面上调用”。

去年七月份有一台旧的Chrome Bug Report

正如人们可以看到的那样,Firefox具有相同的“问题”,我已经用最新的夜晚测试了这一点,但仍然像Chrome一样。

Opera 11中的另一个测试表明,这必须是某种规定的行为,因为Opera 11做了完全相同的事情,但Opera 10在所有的窗口/标签上都发生了事件,可悲的是Opera 11的官方changelogs并没有指出任何改变这个行为。

通过specification阅读,没有什么说这个行为,唯一可以找到的是:

The storage event is fired when a storage area changes, as described in the previous two sections (for session storage, for local storage).

When this happens, the user agent must queue a task to fire an event with the name storage, which does not bubble and is not cancelable, and which uses the StorageEvent interface, at each Window object whose Document object has a Storage object that is affected.

Note: This includes Document objects that are not fully active, but events fired on those are ignored by the event loop until the Document becomes fully active again.

那么这个注释是什么意思?

从另一个specification

A Document is said to be fully active when it is the active document of its browsing context, and either its browsing context is a top-level browsing context, or the Document through which that browsing context is nested is itself fully active.

没有意义是。它是否以任何方式帮助我们?没有。

所以我们(在JavaScript聊天室里)戳了#whatwg看看这一切是什么,到目前为止还没有回应,一旦我们得到任何回应,我会更新我的答案。

现在总结一下

Firefox,Chrome,Safari和Opera具有完全相同的行为,也就是说,它们不会在使用localStorage的机会的标签/窗口上触发。

但IE9 Beta的行为就像Opera 10,所以在所有标签/窗口都会触发。

由于本地存储规范的作者在谷歌在R& D中工作,我几乎不怀疑Chrome会出错,而且由于Bugzilla和Opera上没有Bug,所以改变了11的行为,似乎是这样它应该工作。仍然没有回答为什么它以这种方式工作,为什么IE9的行为是不同的,但是我们还在等待#whatwg的回应。

http://stackoverflow.com/questions/4679023/bug-with-chromes-localstorage-implementation

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:javascript – Chrome的localStorage实现错误?