javascript - 通过removeEventListener删除后音频事件仍然触发事件

标签 javascript reactjs dom-events html5-audio

我的 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看到称所有事件都被删除,但在离开此特定路线/页面时我仍然收到以下错误:

Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the undefined component.

发生这种情况是因为 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);
  });
}

关于javascript - 通过removeEventListener删除后音频事件仍然触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35636453/

相关文章:

javascript - 重新加载页面时保持页面设置

JavaScript、html 和 React js。调用 this.state.filteredUsers.map 时出错((用户)

javascript - 似乎无法通过关键事件更改图像位置

javascript - socket.send 在 io.sockets.on() 之外

javascript - 为什么我可以使用数组索引运算符从 jQuery 对象访问 HTMLElement?

javascript - 如何将事件对象传递给 React 事件处理函数?

javascript - Mobile Safari 的日期/时间类型输入字段触发了哪些事件?

Javascript添加监听器错误: TypeError: trigger. addEventListener不是函数

javascript - 如何防止绝对定位元素在窗口调整大小时重叠?

reactjs - React hook 中的 Object.is 相等性检查导致同一函数有多个版本