addEventListener没有按预期运行

addEventListener not functioning as expected

本文关键字:运行 addEventListener      更新时间:2023-09-26

我正在将教程游戏转换为更强大的应用模式,但在重构事件监听器时遇到了问题。

在原始代码中,我在main函数中定义了侦听器集和回调函数:

(function () {
    "use strict";
    GAME.init();
    function main() {
        GAME.stopMain = window.requestAnimationFrame(main);
        GAME.draw();
        GAME.update();
    } 
    document.addEventListener("keydown", keyDownHandler, false);
    document.addEventListener("keyup", keyUpHandler, false);
    function keyDownHandler(e) {
        if (e.keyCode === 39) {
            GAME.inputs.rightPressed = true;
        } else if (e.keyCode === 37) {
            GAME.inputs.leftPressed = true;
        }
    }
    function keyUpHandler(e) {
        if (e.keyCode === 39) {
            GAME.inputs.rightPressed = false;
        } else if (e.keyCode === 37) {
            GAME.inputs.leftPressed = false;
        }
    }
    main();
})();

当我将侦听器和回调器交换为对GAME.inputs.init();的调用并创建GAME.inputs的这个方法时:

GAME.inputs: {
    keyDownHandler: function(e) {
        if (e.keyCode === 39) {
            this.rightPressed = true;
        } else if (e.keyCode === 37) {
            this.leftPressed = true;
        }
    },
    keyUpHandler: function(e) {
        if (e.keyCode === 39) {
            this.rightPressed = false;
        } else if (e.keyCode === 37) {
            this.leftPressed = false;
        }
    },
    init: function() {
        document.addEventListener("keydown", this.keyDownHandler, false);
        document.addEventListener("keyup", this.keyUpHandler, false);
    }
};

事件监听器停止注册。我以前有过这个问题,只是恢复到旧的方式,但我想了解为什么这不起作用。

你需要调用bind,所以它的作用域不是文档。

 document.addEventListener("keydown", this.keyDownHandler.bind(this), false);
 document.addEventListener("keyup", this.keyUpHandler.bind(this), false);

,根据初始化的方式,它实际上可能是

document.addEventListener("keydown", this.inputs.keyDownHandler.bind(this), false);
 document.addEventListener("keyup", this.inputs.keyUpHandler.bind(this), false);