Javascript事件:window.event vs参数引用(函数)

时间:2015-04-02 22:36:50

标签: javascript google-chrome events

有什么区别:



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

<button>Click!</button>
&#13;
&#13;
&#13;

&#13;
&#13;
function test () {
    console.log("Event: ", event); // same as window.event
}
document.querySelector("button").onclick = test;
&#13;
<button>Click!</button>
&#13;
&#13;
&#13;

它们似乎返回完全相同的对象,甚至包含相同的timeStamp值,以毫秒为单位。

我经常使用第一个示例使用eevt查看代码,但第二个示例有什么问题?

我理解eventwindow.event相同,这是一个全局变量,但如果e做同样的事情,使用event的目的是什么?

1 个答案:

答案 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

     

第二种方式是event handler content attribute

事件处理程序IDL属性

  

事件处理程序IDL属性是特定的IDL属性   event handler。 IDL属性的名称与   event handler的名称。

事件处理程序将是分配给IDL属性的函数。将使用事件作为唯一参数调用该函数(或回调函数):

  带有一个参数的

Invoke 回调,其值为   Event对象 E

示例:

&#13;
&#13;
document.querySelector("button").onclick = function(evt) {
  console.log('Event: ' + evt);
};
&#13;
<button>Click!</button>
&#13;
&#13;
&#13;

事件处理程序内容属性

  

事件处理程序内容属性是a的内容属性   具体event handler。 content属性的名称是   与event handler的名称相同。

设置它们时,处理程序将是internal raw uncompiled handler。这意味着getting the current value of the event handler将更复杂:字符串将被解析为具有名为FunctionBody的参数的函数的event

  

让函数有一个名为event的参数。

示例:

&#13;
&#13;
<button onclick="console.log('Event: ' + event);">Click!</button>
&#13;
&#13;
&#13;

&#13;
&#13;
document.querySelector("button").setAttribute('onclick',
  "console.log('Event: ' + event);"
);
&#13;
<button>Click!</button>
&#13;
&#13;
&#13;

的addEventListener

DOM L2 Events引入,现在DOM4将其定义为:

  

addEventListener(type, callback, capture)方法必须运行这些方法   步骤进行:

     
      
  1. 如果回调为空,请终止这些步骤。

  2.   
  3. event listener附加到event listeners的关联列表,类型设置为类型回调设置为   回调捕获设置为捕获,除非该列表中的event listener具有相同的类型< / strong>下,   回调捕获

  4.   

当事件侦听器为invoked时,将调用回调,并将事件作为唯一参数:

  

调用侦听器回调&#39; handleEvent,事件已通过   将此算法作为第一个参数

示例:

&#13;
&#13;
document.querySelector("button").addEventListener('click', function(evt) {
  console.log('Event: ' + evt);
});
&#13;
<button>Click!</button>
&#13;
&#13;
&#13;


兼容性说明

旧的IE不支持addEventListener,并且没有将任何参数传递给事件处理程序。

但是,它提供了另一种访问事件的方法:window个对象从event继承Window.prototype属性。该属性有一个返回事件对象的getter。

因此,支持旧IE的常用方法是使用参数并在必要时用window.event覆盖它:

&#13;
&#13;
document.querySelector("button").onclick = function(evt) {
  evt = evt || window.event;
  console.log('Event: ' + evt);
};
&#13;
<button>Click!</button>
&#13;
&#13;
&#13;

新IE将事件作为addEventListener和事件处理程序中的参数传递,因此不再需要。它还继续实施Window.prototype.event

同样,Chrome实现了window.event,可能是为了支持为IE编写的旧代码。

但是,最好避免使用它:

  • 不标准。
  • 标准备选方案已广泛实施(旧IE除外)。
  • 它并不适用于所有浏览器,例如在Firefox上。