Update: attachEvent
似乎确实在这里造成了问题。来自 quirksmode.org:
在以下情况下,它指的是窗口:
element.onclick = function () {doSomething()}
element.attachEvent('onclick',doSomething)
<element onclick="doSomething()">
注意存在attachEvent()
。该技术的主要缺点是Microsoft 事件注册模型就是它attachEvent()
创建对该函数的引用但不复制它。因此,有时不可能知道当前哪个 HTML 正在处理该事件。
解决这个问题的唯一方法似乎是创建一个包装器,例如:
var addListener = (function() {
if(document.attachEvent) {
return function(element, event, handler) {
element.attachEvent('on' + event, function() {
var event = window.event;
event.currentTarget = element;
event.target = event.srcElement;
handler.call(element, event);
});
};
}
else {
return function(element, event, handler) {
element.addEventListener(event, handler, false);
};
}
}());
Then this
将引用该元素,就像event.currentTarget
你会通过event
作为第一个参数。
Usage:
addListener(element, 'click', function(e) {
// this refers to element
// e.currentTarget refers to element
// e.target refers to the element that triggered the event
});
旧答案:(适用于inline and 传统的事件处理程序,以及addEventListener
(但不是attachEvent
))
在事件处理程序内部,this
指事件处理程序附加到的元素。