【发布时间】:2021-05-07 07:06:01
【问题描述】:
我有一个 Web 应用程序,页面 A 有视频,而页面 B 没有。该视频在完成视频播放时具有onended 事件。我尝试在使用removeEventListener 卸载组件之前删除该事件,否则将在我切换到页面 B 后触发视频结束事件。
但是,我找不到删除带参数回调的正确方法。 我使用了箭头函数和绑定来传递参数,但是这两种方法使得事件移除是不可能的。
componentDidMount() {
// 1st trial: anonymous function cannot be removed
this.video.onended = () => this.videoOnEndedCallback(params);
// 2nd trial: bind() creates new function, cannot be referenced either
this.video.onended = this.videoOnEndedCallback.bind(this, params);
}
componentWillUnmount() {
this.video.removeEventListener('ended', this.videoOnEndedCallback);
}
最后,我将onended 设置为null,它就可以工作了。
componentWillUnmount() {
this.video.onended = null;
}
问题
如果将onended设置为null等于removeEventListener的效果?
如果没有,有没有其他合适的方法来移除带参数的回调?
【问题讨论】:
-
removeEventListener删除使用addEventListener添加的侦听器,但未直接分配为处理程序,即element.onclick = () => alert('hi');。分配null是删除直接分配的处理程序的正确方法。使用事件侦听器删除侦听器时,您必须传递removeEventListener对addEventListener之前添加的确切函数的引用。 -
@JacobSmit 你的意思是
this.video.removeEventListener('ended', callback)只适用于this.video.addEventListener('ended', callback)? -
是的。
addEventLister/removeEventListener用于Event Listeners 和element.onclick或类似的是Event Handler -
同样,函数必须是相同的引用,所以
const eventListener = () => alert('test'); element.addEventListener('click', eventListener); element.removeEventListener('click', eventListener);将按预期运行,但element.addEventListener('click', () => alert('test')); element.removeEventListener('click', () => alert('test'));不会。 -
看来我需要一个额外的变量来保持对箭头函数的引用。
this.arrowCallback = () => this.callback(params)然后,我可以参考this.arrowCallback为removeEventListener。
标签: javascript reactjs ecmascript-6 dom-events