Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.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事件异常行为,removeEventListener不工作_Javascript_Function_Events - Fatal编程技术网

Javascript事件异常行为,removeEventListener不工作

Javascript事件异常行为,removeEventListener不工作,javascript,function,events,Javascript,Function,Events,我试图通过在处理完事件侦听器后删除它来阻止事件被多次调用。我需要能够多次调用这些函数 但是,我当前的解决方案似乎并没有从ImageVillace中删除事件侦听器,因为当我第二次调用这些函数时,killRacer最终会杀死第一次作为目标的同一个元素以及新目标。killRacer在第二次调用时不应该引用第一个映像,但它会删除第一次指向的同一个映像 以下是对我的问题非常重要的部分的相关功能 function killRacer() { var listOfRaceImgs = getListO

我试图通过在处理完事件侦听器后删除它来阻止事件被多次调用。我需要能够多次调用这些函数

但是,我当前的解决方案似乎并没有从ImageVillace中删除事件侦听器,因为当我第二次调用这些函数时,killRacer最终会杀死第一次作为目标的同一个元素以及新目标。killRacer在第二次调用时不应该引用第一个映像,但它会删除第一次指向的同一个映像

以下是对我的问题非常重要的部分的相关功能

function killRacer() {
    var listOfRaceImgs = getListOfRaceImages();

    var killRacerTimerID = setInterval(moveEvilRaceImage.bind(null, randomRacer), 40);

    imageEvilRace.addEventListener("stopKiller", stopMovingKillerImage.bind(null, killRacerTimerID, randomRacer));
}

function moveEvilRaceImage(imageToKill) {
    imageEvilRace.dispatchEvent(stopKillerEvent);
}

function stopMovingKillerImage(killRacerTimerID, randomRacer) {
    clearInterval(killRacerTimerID);
    randomRacer.style.display = "none";
    randomRacer.style.left = 0 + "px";
    imageEvilRace.src = explosionImageSource;
    imageEvilRace.removeEventListener("stopKiller", stopMovingKillerImage);
}
绑定回调是stopMovingKillerImage.bindnull、killRacerTimerID、randomRacer,但您尝试解除绑定stopMovingKillerImage。它们是两种不同的功能

我将创建一个包装器函数来处理单次使用事件处理程序的正确函数的存储,如下所示:

function bindOnce(object, event, callback) {
    var new_callback = function() {
        callback.apply(this, arguments);
        object.removeEventListener(event, new_callback)
    };

    object.addEventListener(event, new_callback);
}

bindOnce(imageEvilRace, "stopKiller", stopMovingKillerImage.bind(null, killRacerTimerID, randomRacer));