Dav*_*enn 22 javascript html5 google-chrome
对于这个问题,我在将一个函数绑定到Chrome 8.0.552.224中的Storage对象的change事件时得到了一个奇怪的结果.
考试:
<!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>
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我会在第二个选项卡和第二个窗口上显示一个警告框,但不会在调用该事件的选项卡上显示(我点击了).据我所知,我应该看到三个警告框(每个标签打开一个).
这是一个错误吗?有其他人得到这种行为吗?如果不是你在运行什么版本?或者我刚刚完全错了?
Ivo*_*zel 42
事实证明,规范实际上说这是期望的行为,因此IE9的实现被打破了.
4.2 sessionStorage属性
当setItem()的removeItem(),并明确()方法被调用的存储对象X ...如果这些方法做了,然后在每一个HTMLDocument的...... [是]与同一存储区域相关,其他比x,必须触发存储事件....
正如我们所看到的那样,规范确实做得很清楚,这是指定的行为.这就是Opera 10的实施被破坏的原因,也很可能也是IE9实施被打破的原因.
我们从中学到了什么?请务必阅读每一个,单一规格(特别是如果你实现的东西......)的,字.
正如你所说,这里的基本行为是"调用除当前页面以外的所有页面".
去年7月有一个旧的Chrome Bug报告.
正如人们可以在那里阅读的那样,Firefox也有同样的"问题".我用最新的夜间测试了这个,仍然像在Chrome中一样.
在Opera 11的另一个测试表明,这一定是某种spec'ed行为,因为歌剧11不完全一样的事情,但Opera 10的没有在所有的Windows /标签火灾事件.可悲的是,Opera 11的官方更改日志并未说明此行为的任何更改.
阅读规范,没有任何说明这种行为.我唯一能找到的是:
存储区域发生更改时会触发存储事件,如前两节(对于会话存储,对于本地存储)所述.
发生这种情况时,用户代理必须将任务排队,以使用名称存储来触发事件,该事件不会冒泡且不可取消,并且在每个Window对象上使用StorageEvent接口,该对象的Document对象具有受影响的Storage对象.
注意:这包括未完全处于活动状态的Document对象,但事件循环将忽略对其触发的事件,直到Document再次完全处于活动状态.
那么,Note是什么意思呢?
从另一个规范:
当文档是其浏览上下文的活动文档时,文档被称为完全活动,并且其浏览上下文是顶级浏览上下文,或嵌套浏览上下文的文档本身是完全活动的.
没有意义吗?是.它以任何方式帮助我们吗?没有.
因此,我们(在JavaScript聊天室中)在#whatwg上查看了所有这些内容,到目前为止还没有响应.我们会在得到任何回复后立即更新我的回答.
现在结束
Firefox,Chrome,Safari和Opera具有完全相同的行为.也就是说,它们不会触发有机会进入localStorage的选项卡/窗口.
但IE9 Beta的行为与Opera 10类似,因此它会在所有选项卡/窗口上触发.
由于本地存储规范的作者在谷歌的研发工作,我几乎不怀疑Chrome会出错.而且由于在Bugzilla上没有错误,而且Opera改变了11中的行为,似乎这是应该工作的方式.仍然没有回答为什么它以这种方式工作以及为什么IE9表现不同,但我们仍在等待来自#whatwg的响应.
| 归档时间: |
|
| 查看次数: |
19160 次 |
| 最近记录: |