多次注册事件的问题

时间:2018-11-02 15:26:45

标签: javascript

当前,我将其设置为“ if true == true”只是为了简化,因为问题不存在。

switchBoxes(player){
    if (true == true){
        document.addEventListener("keypress", function switchListen(event) {
            if (event.keyCode == 101) {
                console.log("TrapActivated");
            }
        }, {once:true});
    }
}

我的游戏中出现了一个问题,该问题是我在javascript中制作的,当我只按一次“ E”键时,在控制台中会多次看到“ TrapActivated”。 switchBoxes是一个名为碰撞对象的类中的函数。它的目的是创建一个盒子,当您按下“ E”键时,它可以充当开关并影响我创建的地图的其他部分。玩家可以在画布上自由移动地图。我没有碰撞检测,而是让玩家查看他是否在触摸开关,而不是“ if true == true”。参数“玩家”是这样,您可以选择谁可以使用该开关。当我按“ E”时,控制台会向我发送大约34到500条消息。在我按下“ E”键后不久,它就停止了,大约在100-200毫秒后。而且我还没有对帧率做任何事情,因此它应该是默认值。

这是我在本网站上遇到的第一个问题,所以请原谅我。

1 个答案:

答案 0 :(得分:0)

首先,使用event.key而不是event.keyCode;

第二个-您的switchBoxes()函数在每次调用时创建新的侦听器;
因此,这是绝对正确的行为。为避免这种情况,您可以尝试使用removeEventListener。但是,我认为,在这种情况下,最好的方法是在父范围中声明switchListen。像这样:

function switchListen(event) {
    if (event.key === 'e') {
        console.log("TrapActivated");
    }
}

function switchBoxes(player){
    if (true == true){
        document.addEventListener('keypress', switchListen, {once:true});
    }
}

因此,您将创建唯一的一个侦听器,由于once:true,该侦听器将在第一次调用时删除;

相关问题