addEventListener 和 attachEvent 都是用于在 Web 开发中将事件监听器绑定到 DOM 元素上的方法,但它们之间存在一些关键差异:
-
浏览器兼容性:
addEventListener是 DOM Level 2 Events 规范的一部分,它被所有现代浏览器(包括 IE9 及以上版本)支持。attachEvent是微软为 IE8 及以下版本的浏览器提出的一个方法,不是标准的 DOM 事件处理方法。
-
语法:
addEventListener采用以下语法:
其中javascriptelement.addEventListener(event, function, useCapture);event是事件名称(不带on前缀),function是事件处理函数,而useCapture是一个布尔值,用于指定事件是在捕获阶段处理还是在冒泡阶段处理。attachEvent采用不同的语法:
其中javascriptelement.attachEvent(eventWithOn, function);eventWithOn是带有on前缀的事件名称,function是事件处理函数。
-
事件流:
addEventListener允许你指定事件处理函数是在捕获阶段还是冒泡阶段被调用。attachEvent只支持事件冒泡,不支持事件捕获。
-
this 关键字:
- 在
addEventListener中绑定的事件处理函数里,this指向绑定事件的元素。 - 在
attachEvent中绑定的事件处理函数里,this指向全局对象window,而不是绑定事件的元素。
- 在
-
多个事件监听器:
- 使用
addEventListener,你可以为同一个事件添加多个事件监听器,它们会按顺序执行。 - 而
attachEvent有可能会导致多个事件监听器的执行顺序不一致,而且同一个事件处理函数如果添加多次,也会被执行多次。
- 使用
-
移除事件监听器:
addEventListener配对的是removeEventListener,可以用于移除事件监听器。attachEvent配对的是detachEvent,用于移除事件监听器,但需要确保传递给detachEvent的参数与attachEvent时的参数完全一致。
由于 attachEvent 方法是一个非标准方法且仅在老版本的 IE 浏览器中可用,所以通常推荐使用 addEventListener,因为它是跨浏览器兼容的并遵循现代的 Web 标准。当需要支持老版本 IE 浏览器时,开发者可能需要编写额外的代码来兼容 attachEvent。