如果指定了回调函数,则从内部删除事件监听器

时间:2017-07-28 03:31:01

标签: 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);
            });

我想在调用函数后立即删除侦听器?我怎样才能做到这一点?

感谢。

3 个答案:

答案 0 :(得分:2)

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

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() 删除侦听器,那么您可以将其与函数声明相结合,如{{3 }}。)

答案 1 :(得分:0)

您只能删除与之相同的功能

在你的情况下,你可以做

// added this
var x = function() {
    pauseAudioAt(audio, 18, true);
}
//
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', x); // changed this
            showBtn();
        }
    }

}
audio.addEventListener("timeupdate", x); // changed this

答案 2 :(得分:0)

只需使用命名功能。

psql -qAtX -F '^' -c 'TABLE dummy_table' | cut -d '^' -f 1-2,4

它会删除事件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', onTimeUpdate); showBtn(); } } } audio.addEventListener("timeupdate", onTimeUpdate); function onTimeUpdate() { pauseAudioAt(audio, 18, true); } 的句柄onTimUpdate