Javascript事件奇怪的行为,removeEventListener无法正常工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript事件奇怪的行为,removeEventListener无法正常工作相关的知识,希望对你有一定的参考价值。

我试图通过在完成事件时删除事件监听器来阻止多次调用事件。 (我需要能够多次调用这些函数)

但是,我当前的解决方案似乎没有从“imageEvilRace”中删除事件监听器,因为当我第二次调用这些函数时,“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.bind(null, 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));

以上是关于Javascript事件奇怪的行为,removeEventListener无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

parseInt 在事件上的奇怪行为[重复]

打开自定义创建的 .ics 文件时,Iphone 中 safari 的奇怪行为

JavaScript递归奇怪的行为?

输入按键的敲除事件绑定导致奇怪的行为

检查javascript布尔奇怪的行为

jquery $.on() 和使用 date() 时处理奇怪行为的触摸事件