ich mit dem Entfernen einer JavaScript-Event habe Schwierigkeiten, die zu einem DOM-Element wit element.addEventListener
vorher hinzugefügt wurde:Entfernen eines JavaScript-Ereignisses: Warum funktioniert dieses Beispiel nicht?
$(() => {
var example = {
init() {
this.element = document.getElementById('foo');
this.element.addEventListener('mousedown', this.start.bind(this));
},
start() {
console.log('start');
this.element.addEventListener('mouseup', this.stop.bind(this));
},
stop() {
console.log('stop');
this.element.removeEventListener('mouseup', this.stop);
}
};
var bar = Object.create(example);
bar.init();
});
Wenn das Element klicken und die Maustaste halten, 'Start' angemeldet ist. Sobald die Maustaste losgelassen wird, wird "Stop" protokolliert. Das erste Mal funktioniert dies wie vorgesehen, aber das zweite Mal "Stop" wird zweimal protokolliert, dann dreimal, dann vier Mal ... Das bedeutet, dass in stop()
das Ereignis nicht ordnungsgemäß entfernt wird.
Ich weiß, dass ich genau die gleiche Instanz an übergeben muss Ich ging zu addEventListener
, aber mir scheint das in diesem Fall richtig, also bin ich ein wenig verloren, warum das nicht richtig funktioniert.
Ahh das macht Sinn, danke! Was mir nicht bewusst war, dass 'bind' eine neue Funktion zurückgibt, obwohl es ziemlich logisch erscheint, habe ich nie darüber nachgedacht. – Sven
Es ist sogar garantiert, dass 'bind' jedes Mal eine neue Funktion zurückgibt, auch wenn Sie sie mit den gleichen Argumenten aufrufen. – Kaiido