Javascript KeyboardState.pressed在之后始终为真。提示或警报-为什么?

Javascript KeyboardState.pressed在之后始终为真。提示或警报-为什么?,javascript,keyboard,alert,prompt,Javascript,Keyboard,Alert,Prompt,正如标题所说,我尝试了THREEx和Stemkovskis standalone 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键

正如标题所说,我尝试了THREEx和Stemkovskis standalone 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键一次,将其释放;警报窗口弹出,单击“确定”,它将永远再次弹出。为什么会这样?

我想知道它是否与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);

许多浏览器重复
键下操作
。阅读更多信息并
(ctrl+f:自动重复)

以下是针对您的具体问题提出的解决方案:

A.当
keydown
将其状态存储为某个数组中的
true
,并在
keydup
上将其设置为false

wasPressed['F'] = true;  //on keydown
wasPressed['F'] = false; //on keyup
B.检查下一个
键时,也要检查其状态

if (m_vKeyboard.pressed("F") && !wasPressed['F'])
寻求全面实施:

更新

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  = {};
    })

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

if (event.repeat) return;

有人知道如何解决这个问题吗?是的,评论它解决了“总是”的真正问题。但是,我想使用promt让用户插入一个INT值以在算法中使用。也许还有其他方法?是的,使用alert()、prompt()和confirm()是有问题的。您不能使用jQuery或其他库进行提示,这样您就不会调用阻塞类型函数了吗?我的问题是,我无法让网页的其余部分在后台滚动,因此需要进行阻塞调用。我恐怕:/I我还没有尝试过您的解决方案,但我认为它不会起作用。因为当我点击“F”时,我使用了锁定代码的提示符(也就是当我释放“F”时,它不会触发onKeyUp),所以它总是正确的。我看过你的代码,它是如何检查键盘上的按钮当前是否按下的?我尝试了使用提示符(请参见更新),它工作得很好。当然,它工作得很好,你可以将布尔值设置为true(我现在就是这样解的)。如果在关闭提示后第二次单击F会发生什么情况?虽然有效,但感觉是一种廉价的方式;)干杯!现在需要一个解决方案!我知道!这确实是一个廉价的解决办法。但对于快速解决方案,它似乎是最好的!:)