Javascript 按下多个键

Javascript 按下多个键,javascript,html,key-bindings,Javascript,Html,Key Bindings,所以现在我正在使用一个函数,如果一个键被按下,另一个键被按下,不管第一个键是否仍然被按下,它都会将一个值设置为true function doc_keyUp1(e) { if (e.keyCode == 37){ lPunch = true } } function doc_keyUp2(e) { if (e.keyCode == 39){ rPunch = true } } document.a

所以现在我正在使用一个函数,如果一个键被按下,另一个键被按下,不管第一个键是否仍然被按下,它都会将一个值设置为true

 function doc_keyUp1(e) {
      if (e.keyCode == 37){
        lPunch = true 
      }
  }
  function doc_keyUp2(e) {
      if (e.keyCode == 39){
        rPunch = true
      }
  }
  document.addEventListener('keyup', doc_keyUp1, false)
  document.addEventListener('keyup', doc_keyUp2, false)
问题是,我想让它确保,如果第二个键被按下,第一个键必须仍然处于按下状态,这样某人就不能快速按下一个键,然后按下另一个键,让人觉得他们好像同时按下了两个键


有什么想法吗?

我建议您使用
数组来保存关键状态

var keyStates = [ ];

document.addEventListener('keydown', function(e) {
    keyStates.push( e.keyCode );
}, false);

document.addEventListener('keyup', function(e) {
    var pos = null;

    if( (pos = keyStates.indexOf( e.keyCode )) > -1 )
        keyStates.splice( pos, 1 );
}, false);

因此,您可以随时检查当前正在按下的键的数组。

假设您有某种“游戏循环”,类似于以下工作方式(或者我应该说“应该工作”,因为我很久没有编写过类似的代码,所以没有在当前浏览器上测试过它-肯定已经工作了):

var currentKeyCodes=new Object();

function keyDown(e) {
    currentKeyCodes['x'+e.keyCode]=true;
}

function keyUp(e) {

    //Real check here
    if ((e.keyCode==39) && currentKeyCodes['x37']) {
        do_whatever_you_want();
    }

    //Housekeeping
    var s='x'+e.keyCode;
    if (currentKeyCodes[s]) currentKeyCodes[2]=false;
}

我认为web浏览器不支持多个按键。@minitech-我已经实现了一个简单的游戏,它使用keydown和keydup事件来维护一个表,其中的键是向下的,并且可以同时使用多个键。我建议使用一个对象而不是数组。所以
keyStates={}
然后
keyStates[e.keyCode]=true;//或者在keydown和keypup处理程序中为false
,在代码的其他部分中为if(keyStates[“39”]){}
。比
.indexOf()
.splice()
更快更简单。感谢大家的回复。谢谢你,尤其是nnnnnn,你帮我做了我需要的事情,你的过程非常简洁有效。你们太棒了:D:D;D
var keyPressed = {};

document.addEventListener('keydown', function(e) {
   keyPressed[e.keyCode] = true;
}, false);
document.addEventListener('keyup', function(e) {
   keyPressed[e.keyCode] = false;
}, false);

function gameLoop() {
   if (keyPressed["39"] && keyPressed["37"]) {
      // do something (update player object state, whatever)
   }
   // etc
   // update display here
   setTimeout(gameLoop, 5);
}

gameLoop();