【问题标题】:Can't get keydown / keyup to work with pointer lock / fullscreen无法让 keydown / keyup 与指针锁定/全屏一起使用
【发布时间】:2012-04-15 15:05:50
【问题描述】:

我的问题是我最近开始将我的 HTML5 webapp 更改为使用全屏 + 指针锁定,而不是在窗口中拖动鼠标。该应用程序除了鼠标外还使用键盘,以前一切正常。但是,现在我无法使用任何类型的按键。指针锁定鼠标完美运行。

以前我听过这样的按键:

document.onkeydown = handleKeyDown;
document.onkeyup = handleKeyUp;

其中handleKeyDown和Up是函数,例如:

function handleKeyUp(event) {
    doStuffWith(event.keyCode);
}

现在,我在 mousemove 侦听器旁边添加了键盘侦听器:

document.addEventListener('keyup', handleKeyUp(event), false);
document.addEventListener('keydown', handleKeyDown(event), false);

其中 handleKey* 与上面相同,但 doStuffWith 不做任何事情。它似乎得到了一些未定义的事件,没有别的。这可能是一个相当基本的问题,但我很难解决它。我在 Google 上找到的大多数示例和教程都没有使用 addEventListener,而是使用了我之前使用的旧样式。

我非常感谢任何帮助。

edit // 澄清一下:由于事件未定义,doStuffWith 根本不会被调用,因为在尝试读取未定义的 .keyCode 时执行会停止

【问题讨论】:

    标签: javascript html events javascript-events


    【解决方案1】:

    主要问题是,根据以下 MDN 页面,字母数字键在全屏模式下被禁用:

    https://developer.mozilla.org/en/DOM/Using_full-screen_mode#Things_your_users_want_to_know

    您的代码也存在一些问题。在行中

    document.addEventListener('keyup', handleKeyUp(event), false);
    

    ...您有两个问题:首先,第二个参数需要是对函数的引用。它实际上是对undefined 的引用,因为您正在立即调用函数并传入结果而不是传入函数。其次,在支持addEventListener的浏览器中,Event对象会自动传入事件监听函数。因此,您想要的是:

    function handleKeyUp(e) {
        doStuffWith(e.keyCode);
    }
    
    document.addEventListener('keyup', handleKeyUp, false);
    

    【讨论】:

    • 谢谢,我知道有这样的事情!不幸的是,它并不能解决问题。监听器似乎适用于非全屏,但在全屏中,根据日志发生的唯一关键事件是 esc 上升时,即在退出全屏之后。
    • @Asta:好的。我对使用全屏和指针锁定几乎一无所知,所以我可能无法提供更多帮助,除了提供这个提到在全屏模式下禁用字母数字键的链接:developer.mozilla.org/en/DOM/…
    • 谢谢,这就是原因!我只尝试了字母数字(因为这是应用程序使用的)。箭头键工作正常。不过,不能说我真的理解这个决定,因为大多数 FPS 使用 wasd 和 numbers。你介意用这些信息回答一下,以便我接受吗?
    • @Asta:完成,我更新了我现有的答案。 MDN 上提到的推理(防范网络钓鱼攻击)对我来说有些道理,尽管我完全同意这对游戏完全适得其反。
    • 我做了一些谷歌搜索,似乎计划/即将推出具有全键盘支持的全屏模式。目前 Mozilla 似乎支持 requestFullScreenWithKeys() 方法和 Webkit webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT) 方法。不过,我也没有验证。
    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    相关资源
    最近更新 更多