删除 JavaScript 事件:为什么这个例子不起作用?
Removing a JavaScript event: Why is this example not working?
我正在努力删除之前添加到 DOM 元素的 JavaScript 事件 element.addEventListener
:
$(() => {
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();
});
单击元素并按住鼠标按钮时,会记录 'start'。一旦鼠标按钮被释放,'stop' 就会被记录下来。第一次按预期工作,但第二次 'stop' 被记录了两次,然后是三次,然后是四次......这意味着在 stop()
中,事件没有被正确删除.
我知道我必须将完全相同的实例传递给 removeEventListener
我传递给 addEventListener
,但对我来说这在这种情况下似乎是正确的,所以我有点迷茫为什么这是'工作正常。
它不起作用,因为bind
return这是一个新功能,与您原来的功能不同。您正在添加一个作为处理程序,但试图删除另一个。
您需要在某处存储 bind
的 return 值,并将其用于添加和删除事件处理程序。
我正在努力删除之前添加到 DOM 元素的 JavaScript 事件 element.addEventListener
:
$(() => {
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();
});
单击元素并按住鼠标按钮时,会记录 'start'。一旦鼠标按钮被释放,'stop' 就会被记录下来。第一次按预期工作,但第二次 'stop' 被记录了两次,然后是三次,然后是四次......这意味着在 stop()
中,事件没有被正确删除.
我知道我必须将完全相同的实例传递给 removeEventListener
我传递给 addEventListener
,但对我来说这在这种情况下似乎是正确的,所以我有点迷茫为什么这是'工作正常。
它不起作用,因为bind
return这是一个新功能,与您原来的功能不同。您正在添加一个作为处理程序,但试图删除另一个。
您需要在某处存储 bind
的 return 值,并将其用于添加和删除事件处理程序。