【发布时间】:2013-04-30 18:20:10
【问题描述】:
首先让我说我了解以下代码存在重大问题。具体来说,event 参数不会传递到函数中。我不明白为什么在下面的代码中,Chrome、Opera、Safari、Firefox 和 IE 都以不同的方式对待 event 变量。
$('#eventBtn').on('click', function() {
console.log(event);
event.preventDefault();
});
在 Chrome、Opera 和 Safari 中,上述代码有效。 IE 在第二行失败,Firefox 立即失败。出于测试目的,我创建了一个稍微修饰的jsFiddle。以上console.log(event)在各种浏览器中的输出:
Chrome 版本 26.0.1410.64 m
MouseEvent {dataTransfer: null, toElement: button#superBtn, fromElement: null, y: 20, x: 33…}Opera 版本 12.15
鼠标事件Safari 版本 6.0.2 (8536.26.17)
鼠标事件IE 版本 10.0.9200.16540
[对象 MSEventObj]Firefox 版本 20.0.1
ReferenceError: 事件未定义
我被 Chrome、Opera 和 Safari 的这个“功能”所吸引,因为它按预期工作,而不是按编码在其他浏览器中创建意外行为。虽然 IE 也有一个全局 event 变量,但与上述浏览器不同,它不会将该变量分配给当前正在触发的事件。 Firefox 没有全局 event 变量,因此一旦引用 event 就会失败。
通常我使用e 来表示事件变量,正如预期的那样,在所有浏览器中都以相同的方式失败。为什么 Chrome、Opera 和 Safari 有一个全局的 event 变量,它们以这种方式分配?这种行为是否记录在某处?除了不要使用event 来命名变量之外,对于处理这个“特性”有什么建议吗?
【问题讨论】:
-
@nullability 这就是他的问题的重点:他没想到它会被定义,但它在大多数浏览器中都有。请参阅我刚刚链接到的问题以获取解释。
-
@nullability 你读过这个问题吗?我同意这是一个我没有发现的编程错误,因为我没有完全测试过跨浏览器。这是来自 Chrome、Opera 和 Safari 的令人惊讶的行为。我本来希望他们能得到与 Firefox 和 IE 类似的结果。 (是的,你明白我认为上一句话 IE 正确地做到了这一点,而 Chrome 等似乎在处理这个错误)。
-
@barmar 我喜欢在 SO 中搜索以前提出的问题时失败,但我希望我的问题更多地是因为它为什么以这种方式设计而不是为什么以这种方式运行。跨度>
-
它最初是一个 IE 的东西。 IE的一些偏差已被其他浏览器采用。
标签: javascript events cross-browser