在JavaScript中,`addEventListener` 和 `attachEvent`(后者主要是为旧版IE浏览器设计的)在绑定事件处理器时,确实存在关于`this`关键字行为上的差异。
### `addEventListener`
`addEventListener` 是现代浏览器(包括IE9及以上版本)中推荐的事件监听方式。当使用 `addEventListener` 绑定事件时,事件处理器函数内部的 `this` 关键字指向触发事件的元素(即事件的目标元素)。
element.addEventListener('click', function(event) {
console.log(this); // 这里的this指向element
});
### `attachEvent`
`attachEvent` 是旧版IE浏览器(IE8及以下)中用于添加事件监听器的方法。然而,`attachEvent` 有一个特殊的行为,即它总是将事件处理器函数内部的 `this` 关键字设置为全局对象(在浏览器中是`window`对象),而不是触发事件的元素。
element.attachEvent('onclick', function(event) {
console.log(this); // 在IE中,这里的this指向window
// 为了获取触发事件的元素,需要使用event.srcElement
console.log(event.srcElement); // 这将指向element
});
### 解决方案
为了在使用 `attachEvent` 时也能方便地访问触发事件的元素,你可以使用 `event.srcElement` 属性,它在IE中指向触发事件的元素,与 `addEventListener` 中的 `this` 类似。
### 跨浏览器兼容
为了编写跨浏览器的代码,你可能需要编写一个函数来检查浏览器是否支持 `addEventListener`,并据此决定使用哪种方法添加事件监听器。同时,你可能还需要在 `attachEvent` 的事件处理器中调整 `this` 的指向,或者使用 `event.srcElement` 来获取触发事件的元素。
不过,随着现代Web开发的进展,`attachEvent` 已经很少被使用,因为它只被旧版IE浏览器支持。对于新项目,建议使用 `addEventListener`,并考虑使用polyfills或库(如jQuery)来提供跨浏览器的兼容性。