Смотрите мой код http://jsfiddle.net/kxATT/3/Значение этого показывает разные результаты, когда обработчики событий назначаются двумя различными способами
function byId(id) {
if (id) {
return document.getElementById(id);
} else {
return null;
}
}
function setAttr(elm, attr, value) {
elm.setAttribute(attr, value);
}
var app = {
id: 12,
fn: function() {
alert(this.id);
}
};
function init() {
setAttr(byId('txt'), 'onclick', 'app.fn()');
byId('txt1').addEventListener('click', app.fn, true);
}
Когда первый ящик щелкнул, он предупреждает 12
. А для второго ящика это txt1
. Очевидно, что в обоих случаях, хотя я вызываю одну и ту же функцию, this
относится к различным объектам. Я слышал, что для входных элементов сам объект элемента передается функции и записывается как this
внутри функции обработчика событий. Если да, то почему это не так, когда события добавляются с помощью setAttribute.
'app.fn()' .... внутри этой функции, 'this' будет ссылаться на' app'. [Подробнее о 'this' на MDN] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/this). Это правда, что 'this' относится к элементу в обработчике событий. Попробуйте 'setAttr (byId ('txt'), 'onclick', 'console.log (this); app.fn()');'. Содержимое строки ''app.fn()'' является телом обработчика события, поэтому там 'this' будет ссылаться на элемент. Но 'app.fn()' - это просто функция, вы вызываете * из * обработчика события, а контекст никогда не «переносится» (если вы не используете '.call()' или '.apply()'). –
спасибо за эту ссылку ... Его новая информация для меня –