【发布时间】:2011-06-09 09:23:13
【问题描述】:
我在 Safari 5.0(并非所有基于 WebKit 的浏览器)中遇到了以下问题,这段代码:
<html>
<script>
var onstorage = function(evt) {
alert([evt.key, evt.oldValue, evt.newValue].join('\n'));
}
var onclick = function(evt) {
localStorage.setItem('test', Math.random());
}
var oninit = function() {
//actually, it works the same way with old "plain event" onclick
document.querySelector('#test').addEventListener('click', onclick, false);
window.addEventListener('storage', onstorage, false);
}
</script>
<body onload="oninit()">
<input id="test" type="button" value="setting a random value"/>
</body>
将触发警报,以防我们单击按钮。虽然这段代码 -
<html>
<script>
var onstorage = function(evt) {
alert([evt.key, evt.oldValue, evt.newValue].join('\n'));
}
var onclick = function(evt) {
localStorage.setItem('test', Math.random());
}
var oninit = function() {
window.addEventListener('storage', onstorage, false);
//actually, it works the same way with old "plain event" onclick
document.querySelector('#test').addEventListener('click', onclick, false);
}
</script>
<body onload="oninit()">
<input id="test" type="button" value="setting a random value"/>
</body>
意外地触发了一些警报。 我确实认为这是一个错误,但有人无法解释我 - 为什么只交换两行代码会导致这种奇怪的行为?
【问题讨论】:
-
不知道,
onstorage不适合我。但总的来说,您应该避免调用全局变量/函数onstorage或onclick。因为onclick可以作为window.onclick访问,所以即使没有addEventHandler,它也会收到window的点击事件! -
bobince,愚蠢的我)))你是完全正确的 - 全局范围内的 onclick 变量存在一些问题。尽管如此,这是一个错误,但不那么神秘)
-
当您尝试使用保留的全局方法名称时,这是一个怎样的错误?
-
除了名称与 onclick 冲突外,以“on”开头的处理函数名称会使它们与实际的事件处理程序(如 onclick 和 onload)混淆。我认为最好给处理程序起一个名称来描述他们正在响应什么或他们做什么,例如“handleClick”或“initData”。
标签: javascript html safari