12

首先让我说我知道下面的代码有一个主要问题。具体来说,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变量命名来处理这个“特性”之外还有什么建议吗?

4

1 回答 1

6

IE 始终提供一个全局event变量,这与 W3C 标准所规定的不同。其他浏览器也在做同样的事情,以提供与使用旧 IE 版本开发的网站的向后兼容性。

虽然 IE 也有一个全局事件变量,但与上述浏览器不同,它不会将该变量分配给当前正在触发的事件。

我相信确实如此。

于 2013-04-30T18:23:56.680 回答