Przyjrzyj się metodzie handleEvent
https://developer.mozilla.org/en-US/docs/Web/API/EventListener
„Surowy” JavaScript:
function MyObj() {
this.abc = "ABC";
}
MyObj.prototype.handleEvent = function(e) {
console.log("caught event: "+e.type);
console.log(this.abc);
}
var myObj = new MyObj();
document.querySelector("#myElement").addEventListener('click', myObj);
Teraz kliknij na swój element (o identyfikatorze „myElement”) i powinien wyświetlić się w konsoli:
złapane zdarzenie: kliknij
ABC
Dzięki temu możesz mieć metodę obiektu jako procedurę obsługi zdarzeń i mieć dostęp do wszystkich właściwości obiektu w tej metodzie.
Nie możesz po prostu przekazać metody obiektu bezpośrednio do addEventListener (tak:) element.addEventListener('click',myObj.myMethod);
i oczekiwać, myMethod
że będę zachowywał się tak, jakbym był normalnie wywoływany na obiekcie. Zgaduję, że każda funkcja przekazana do addEventListener jest w jakiś sposób kopiowana, a nie odwoływana. Na przykład, jeśli przekażesz odwołanie do funkcji nasłuchiwania zdarzeń do addEventListener (w postaci zmiennej), a następnie cofniesz ustawienie tego odwołania, detektor zdarzeń będzie nadal wykonywany po przechwyceniu zdarzeń.
Innym (mniej eleganckim) obejściem polegającym na przekazaniu metody jako nasłuchiwania zdarzeń this
i zachowaniu dostępu do właściwości obiektu w detektorze zdarzeń byłoby coś takiego:
var myObj = new MyObj();
document.querySelector("#myElement").addEventListener('click', myObj.handleEvent.bind(myObj));