音频事件在通过删除事件侦听器删除后仍然触发事件
Audio event still firing off event after removed via removeEventListener
我的 React 组件中有以下两个生命周期方法,这是一个包含 HTML <audio>
元素的音轨:
componentDidMount() {
const {track} = this.props;
this.refs.audio.src = track.getTrackUrl();
_.each(this.audioEvents, (callback, eventName) => {
this.refs.audio.addEventListener(eventName, callback.bind(this));
});
}
componentWillUnmount() {
_.each(this.audioEvents, (callback, eventName) => {
console.info(`Removed ${eventName} from ${this.props.track.name}`);
this.refs.audio.removeEventListener(eventName, callback.bind(this));
});
}
我可以从console.info
调用中看到所有事件都被删除了,但是在导航离开此特定路由/页面时仍然收到以下错误:
警告:setState(...):只能更新已挂载或已挂载的组件。这通常意味着您在未挂载的组件上调用了 setState()。这是无操作。请检查未定义组件的代码。
发生这种情况是因为即使我应该删除了所有事件处理程序,pause
回调仍然被触发:
pause() {
console.log('pause got fired for', this.props.track.name);
this.setState({playing: false});
},
我错过了什么?我正在尝试在组件卸载时进行很好的清理,但由于某种原因,当我离开页面(导致音频停止播放)时,我的pause
事件处理程序仍然会触发。
使用 .bind
时,将创建函数的新实例。因此,当您执行此操作时:
this.refs.audio.addEventListener(eventName, callback.bind(this));
您将无法再删除该事件侦听器,因为您没有保留对 callback.bind(this)
的引用。以下是解决方法。
componentDidMount() {
const {track} = this.props;
this.refs.audio.src = track.getTrackUrl();
this.boundAudioEvents = _.mapValues(this.audioEvents, (callback, eventName) => {
const boundEvent = callback.bind(this)
this.refs.audio.addEventListener(eventName, boundEvent);
return boundEvent;
});
}
componentWillUnmount() {
_.each(this.boundAudioEvents, (callback, eventName) => {
console.info(`Removed ${eventName} from ${this.props.track.name}`);
this.refs.audio.removeEventListener(eventName, callback);
});
}
相关文章:
- 兰吉 |如何在 span 标签上使用单击事件删除突出显示的文本
- javascript删除事件侦听器
- 从dom中删除任何元素后,Touchmove事件停止触发
- fullcalendar在删除导致浏览器挂起的多个事件时速度较慢
- 使用jQuery删除动态创建的元素上的mouseenter事件
- IE9-添加和删除DOM元素会破坏父keydown事件
- 如何在不删除类似侦听器的情况下从父对象中删除jQuery事件侦听器
- 选择选项是添加或删除事件
- 删除在特定事件上设置的样式
- jQuery使用.of()删除事件处理程序时出现的问题
- 可以clearTimeout删除JavaScript中已触发超时事件的未处理回调
- 如何删除可拖动组中某个元素上的拖动事件
- 删除Google Calander API中的事件
- fullcalendar后台事件:允许删除
- 删除所有按下的按键事件
- 分配和删除单击事件
- jquery on事件删除除span之外的所有标记
- 根据事件有条件地阻止事件删除
- HTML - 粘贴事件删除多余的空格
- 事件删除搜索下拉列表