KeyboardState..prompt或alert后总是为true -为什么?

KeyboardState.pressed is always true after .prompt or alert - Why?

本文关键字:true 为什么 prompt alert KeyboardState      更新时间:2023-09-26

正如标题所说,我尝试过THREEx和Stemkovskis独立KeyboardState.js,它们似乎都没有正确更新。

这是我的代码:

m_vKeyboard = new THREEx.KeyboardState();
// m_vKeyboard.update(); // if using stemkovskis
if (m_vKeyboard.pressed("F")) {
    alert("And now it is always true!");
}

你按一次F键,释放它;警报窗口弹出,点击确定,它会永远弹出。怎么会?

许多浏览器重复使用keydown。在这里和这里阅读更多(ctrl+f : auto-repeat)

这是一个针对你具体问题的建议解决方案:

。当keydown将其状态存储为true,并在keyup上设置为false时,

wasPressed['F'] = true;  //on keydown
wasPressed['F'] = false; //on keyup

B。当检查下一个keydown时,也检查它的状态。

if (m_vKeyboard.pressed("F") && !wasPressed['F'])

查找完整实现:Here

var wasPressed  = {};
if( keyboard.pressed('F')  && !wasPressed['f'] ){
            alert("F was pressed");
            prompt("Enter data : ");
            wasPressed['f'] = true;         
        }

更新2

keyboard.domElement.addEventListener('keydown', function(event){
            wasPressed  = {};
    })

我想知道它是否与alert()是阻塞调用有关。使用下面的代码给我你同样的问题。如果我注释掉alert()并取消注释console.log(),它似乎可以正常工作。然而,我不确定这是否有助于你的问题。

    var m_vKeyboard = new THREEx.KeyboardState();
    setInterval(function () {
        var key = "F";
        var pressed = m_vKeyboard.pressed(key);
        alert("And now it is always true!");
        //console.log("key", key, "pressed", pressed);
    }, 100);

只需将此添加到KeyboardState.js中的onKeyDown开头:

if (event.repeat) return;