有什么区别:
function test (e) {
console.log("Event: ", e);
}
document.querySelector("button").onclick = test;

<button>Click!</button>
&#13;
并
function test () {
console.log("Event: ", event); // same as window.event
}
document.querySelector("button").onclick = test;
&#13;
<button>Click!</button>
&#13;
它们似乎返回完全相同的对象,甚至包含相同的timeStamp
值,以毫秒为单位。
我经常使用第一个示例使用e
或evt
查看代码,但第二个示例有什么问题?
我理解event
与window.event
相同,这是一个全局变量,但如果e
做同样的事情,使用event
的目的是什么?
答案 0 :(得分:7)
添加事件侦听器有两种标准方法:事件处理程序和addEventListener
。
最初是DOM0(未经任何规范定义,但已广泛实施),它们已在HTML5 spec中正确定义。
许多对象可以指定事件处理程序。这些充当 它们所在的对象的非捕获事件侦听器 指定。 [DOM]
event handler有一个名称,始终以&#34;
on
&#34;和 后面跟着它所针对的事件的名称。event handler可以为null,也可以设置为a 回调对象,或设置为internal raw uncompiled handler。
EventHandler
回调函数类型描述了这是怎么回事 暴露于脚本。最初,事件处理程序必须设置为null。事件处理程序以两种方式之一暴露。
所有事件处理程序通用的第一种方式是event handler IDL attribute。
事件处理程序IDL属性是特定的IDL属性 event handler。 IDL属性的名称与 event handler的名称。
事件处理程序将是分配给IDL属性的函数。将使用事件作为唯一参数调用该函数(或回调函数):
带有一个参数的
示例:
document.querySelector("button").onclick = function(evt) {
console.log('Event: ' + evt);
};
&#13;
<button>Click!</button>
&#13;
事件处理程序内容属性是a的内容属性 具体event handler。 content属性的名称是 与event handler的名称相同。
设置它们时,处理程序将是internal raw uncompiled handler。这意味着getting the current value of the event handler将更复杂:字符串将被解析为具有名为FunctionBody
的参数的函数的event
:
让函数有一个名为
event
的参数。
示例:
<button onclick="console.log('Event: ' + event);">Click!</button>
&#13;
document.querySelector("button").setAttribute('onclick',
"console.log('Event: ' + event);"
);
&#13;
<button>Click!</button>
&#13;
由DOM L2 Events引入,现在DOM4将其定义为:
addEventListener(type, callback, capture)
方法必须运行这些方法 步骤进行:
如果回调为空,请终止这些步骤。
- 醇>
将event listener附加到event listeners的关联列表,类型设置为类型,回调设置为 回调和捕获设置为捕获,除非该列表中的event listener具有相同的类型< / strong>下, 回调,捕获。
当事件侦听器为invoked时,将调用回调,并将事件作为唯一参数:
调用侦听器的回调&#39;
handleEvent
,事件已通过 将此算法作为第一个参数
示例:
document.querySelector("button").addEventListener('click', function(evt) {
console.log('Event: ' + evt);
});
&#13;
<button>Click!</button>
&#13;
旧的IE不支持addEventListener
,并且没有将任何参数传递给事件处理程序。
但是,它提供了另一种访问事件的方法:window
个对象从event
继承Window.prototype
属性。该属性有一个返回事件对象的getter。
因此,支持旧IE的常用方法是使用参数并在必要时用window.event
覆盖它:
document.querySelector("button").onclick = function(evt) {
evt = evt || window.event;
console.log('Event: ' + evt);
};
&#13;
<button>Click!</button>
&#13;
新IE将事件作为addEventListener
和事件处理程序中的参数传递,因此不再需要。它还继续实施Window.prototype.event
。
同样,Chrome实现了window.event
,可能是为了支持为IE编写的旧代码。
但是,最好避免使用它: