Обновление: 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);
};
}
}());
Тогда this
будет ссылаться на элемент, как и event.currentTarget
, и вы передадите event
в качестве первого аргумента.
Использование:
addListener(element, 'click', function(e) {
// this refers to element
// e.currentTarget refers to element
// e.target refers to the element that triggered the event
});
Старый ответ: (который работает для встроенных и традиционных обработчиков событий, а также addEventListener
(но не attachEvent
))
Insideобработчик события, this
относится к элементу, к которому прикреплен обработчик события.