javascript - 如何删除带参数的事件回调
问题描述
我有一个 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
?
如果没有,是否有任何其他适当的方法来删除带参数的回调?
解决方案
如果事件侦听器是使用命名的事件属性(.onended
在这种情况下)设置的,则可以通过重新分配来更改它,并通过将其设置为来删除它null
。(以这种方式只能为每个事件设置一个侦听器。)
另一种方式,.addEventListener()
可以为同一个事件注册多个事件监听器,不能更改,只能通过.removeEventListener()
(需要引用设置的监听器)来移除。
这两种方式相互配合,但无论哪种方式,您都必须为每个侦听器选择用于添加/更改/删除该侦听器的方法。
在您的情况下,使用事件侦听器属性更容易,就像您.bind()
使用函数一样,您将没有对新函数的引用,因此您将无法通过.removeEventListener()
.
另一方面,如果你存储它的引用,你也可以使用.addEventListener()
/.removeEventListener()
方法:
constructor(){
this.boundVideoOnEndedCallback = this.videoOnEndedCallback.bind(this, params); //You can also use the arrow-function-version here
}
componentDidMount() {
this.video.addEventListener('ended', this.boundVideoOnEndedCallback)
}
componentWillUnmount() {
this.video.removeEventListener('ended', this.boundVideoOnEndedCallback);
}
推荐阅读
- typescript - 调用函数引用的对象时出错
- javascript - Javascript - React Native 控制台错误“版本不匹配”
- office-js - Outlook / Word 加载项:如何突出显示部分文本(范围)
- java - H2 数据库 - 抛出一般错误:“java.lang.IllegalStateException:无法读取位置 2199023614787 的页面
- python - 搜索谷歌新闻文章 Python
- typescript - 联合类型 - 允许不同的子类型 |
- matlab - Matlab中的八叉树方法
- azure-devops - Azure 构建管道 - 获取源 - 清理 - `Sources` 和 `Sources directory` 之间有什么区别?
- google-bigquery - BigQuery 中 json 字符串值内的双引号
- javascript - 在控制台 JQuery 中未定义