我的按键捕获脚本在Firefox中不起作用,为什么?

时间:2012-03-04 22:22:22

标签: javascript html firefox input

我找到了一个脚本,可以处理我正在构建的基于HTML5的小游戏的输入:

var KEY = {W: 87, A: 65, S:83, D: 68, E: 69};

var input = {
    right: false,
    up: false,
    left: false,
    down: false,
    e: false
};

function press() 
{
    if (!ni)
    {
        var evt=window.event;
        var code = evt.keyCode;

        switch(code) 
        {
            case KEY.W: input.up = true; break;
            case KEY.A: input.left = true; break;
            case KEY.S: input.down = true; break;
            case KEY.D: input.right = true; break;
            case KEY.E: input.e = true; break;
        }
    }
}

function release()
{
    if (!ni)
    {
        evt=window.event;
        var code = evt.keyCode; 
        input.code = code;

        switch(code) 
        {
            case KEY.W: input.up = false; break;
            case KEY.A: input.left = false; break;
            case KEY.S: input.down = false; break;
            case KEY.D: input.right = false; break;        
            case KEY.E: input.e = false; break;
        }
    }
}

这是事件处理程序的分配方式:

document.addEventListener("keydown", press);
document.addEventListener("keyup", release);

当玩家在文本框中输入文本时偶尔显示的变量ni是真的,我很确定它不会导致问题。此外,这在chrome中完美运行,但正如我所说,在Firefox中不起作用。有人在乎解释原因吗? Firefox版本:10.0.2.4428。

2 个答案:

答案 0 :(得分:3)

非标准 window.event对象仅适用于IE和Chrome。

在符合标准的浏览器中,event对象作为第一个参数传递给事件侦听器。

变化:

function press() {
    if (!ni) {
        var evt=window.event;

为:

function press(evt) {              // <-- Declaration of evt
    if (!ni) {
        evt = evt || window.event; // <-- Notice: var is omitted

等效地:

function release(evt) {

答案 1 :(得分:-1)

在Firefox中,您需要使用e.which代替e.keyCode

您可以将其与:

兼容

var keyCode = e.which || w.keyCode;