function MyObject() {
this.name = "";
this.elements = document.getElementsByClassName('myClass');
}
MyObject.prototype.attachEventHandlers = function() {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].addEventListener('click', this.myEventHandler);
}
};
MyObject.prototype.myEventHandler = function() {
// Here "this" referst to the element that the event invoked on:
console.log(this.innerHTML);
// Is there a way to get the name property like:
// console.log(this.name);
// without passing the instance as an argument?
};
var myObject = new MyObject();
myObject.name = "Foo";
myObject.attachEventHandlers();
Я хотел бы использовать метод myEventHandler
как даже обработчик, но, как вы знаете, в обработчики событий this
относятся к элементу, что событие было вызвано на ,Прикрепления метод объекта к событию, сохраняя при этом опорный элемент
Я хотел бы, чтобы сохраняли ссылку на элемент, на который было вызвано событие, а также сохраняют ссылку на экземпляр объекта.
Есть два способа я могу думать:
Передача экземпляра объекта в качестве аргумента в обработчик событий, как:
// ... var that = this; this.elements[i].addEventListener('click', function() { that.myEventHandler(that); } // ... MyObject.prototype.myEventHandler = function(that) { // ...
То же самое, что и выше, но вместо используя метод прототипа, используя встроенную функцию.
Я бы предпочел не использовать встроенную функцию, поскольку она загромождает код. И я бы предпочел не передавать экземпляр объекта в качестве аргумента, если мне это не нужно.
Есть ли более идиоматический и простой способ достичь этого?
'this.elements [i] .addEventListener ('click', function (e) {e.target.myEventHandler (e)});' – Redu