javascript - 如果指定回调函数,则从内部移除事件监听器

标签 javascript

我有一种情况,我想将带有参数的函数附加到事件监听器,如下所示:

var pauseAudioAt = function(aud, seconds, removeListener) {
    console.log(aud.currentTime);
    // check whether we have passed 5 minutes,
    // current time is given in seconds
    if(aud.currentTime >= seconds) {
        // pause the playback
        aud.pause();
        if (removeListener) {
            aud.removeEventListener('timeupdate', pauseAudioAt);
            showBtn();
        }
    }

}
audio.addEventListener("timeupdate", function() {
                pauseAudioAt(audio, 18, true);
            });

我想在函数调用后立即删除监听器?我怎样才能实现这个目标?

谢谢。

最佳答案

您必须向 .removeEventListener() 传递一个对您传递给 .addEventListener() 的同一函数的引用。对现有代码进行最小更改的一种方法是命名您的(当前是匿名的)函数表达式,然后将该函数传递给 pauseAudioAt() 而不是传递 bool 值:

var pauseAudioAt = function(aud, seconds, listenerToRemove) {
    console.log(aud.currentTime);
    // check whether we have passed 5 minutes,
    // current time is given in seconds
    if(aud.currentTime >= seconds) {
        // pause the playback
        aud.pause();
        if (typeof listenerToRemove === "function") {
            aud.removeEventListener('timeupdate', listenerToRemove);
            showBtn();
        }
    }    
}

audio.addEventListener("timeupdate", function listener1() {
    pauseAudioAt(audio, 18, listener1);
});

这样,pauseAudioAt() 就不需要对需要删除的函数进行硬编码引用。

如果您想调用 pauseAudioAt() 而不删除监听器,则只需省略该参数:pauseAudioAt(audio, 18) - 或者传递 falsenull 或其他更方便的东西:pauseAudioAt(audio, 18, null)

(如果您希望能够从代码的其他部分调用 pauseAudioAt() 并删除监听器,那么您可以将其与函数声明结合起来,如下所示如 Jaromanda X's answer 所示。)

关于javascript - 如果指定回调函数,则从内部移除事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45364411/

相关文章:

javascript - 如何在 D3 圆包中使用 pack.sort() 函数?

javascript - 对 JavaScript 文件强制进行 GZIP 压缩

javascript - 如何修复 ScrollView 内屏幕上的 View - 原生 react

javascript - 如何使用 lodash map/countBy/groupBy 处理 JSON 字段?

javascript - 使用原型(prototype)时,我需要将所有内容包装在 DOM 加载上吗?

javascript - 如何将 VueJS 数据传递给另一个脚本?

javascript - 触摸不适用于 Twitter Bootstrap 模板中的移动浏览器

javascript - HTML5中属性的回退解决方案

javascript - 无法在 Phaser 中显示简单图像

javascript - 在脚本中使用 ZipFile java 类读取 zip 文件内容