Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果指定了回调函数,则从内部删除事件侦听器_Javascript - Fatal编程技术网

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

Javascript 如果指定了回调函数,则从内部删除事件侦听器,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)

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

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);
            });
我想在调用函数后立即删除侦听器?我怎样才能做到这一点


谢谢。

您只能删除与添加的功能完全相同的功能

在你的情况下,你可以这样做

// 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

您只能删除与添加的函数完全相同的函数

在你的情况下,你可以这样做

// 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

只需使用命名函数

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);
}

它将删除事件
timeupdate
的句柄
onTimUpdate

,只需使用命名函数即可

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);
}

它将删除事件
timeupdate
的句柄
onTimUpdate
,您必须传递
。removeEventListener()
对传递给
的相同函数的引用。对现有代码进行最小更改的一种方法是命名(当前为匿名)函数表达式,然后将该函数传递给
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)
- 或者传递
false
null
或其他更方便的信息:
pauseAudioAt(音频,18,null)


(如果希望能够从代码的其他部分调用
pauseAudioAt()
,并删除侦听器,则可以将其与中所示的函数声明相结合。)

必须向
.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)
- 或者传递
false
null
或其他更方便的信息:
pauseAudioAt(音频,18,null)


(如果您希望能够从代码的其他部分调用
pauseAudioAt()
,并删除侦听器,则可以将其与函数声明结合起来,如中所示。)

谢谢!救了我一天!谢谢救了我一天!