2013-10-29 33 views
4

我想创建一个游戏一个简单的事件处理程序,这是我的代码jQuery的键盘事件处理程序按住

 $(document).keydown(function(e){ 
     switch(e.keyCode){ 
     case 65: //left (a) 

      console.log('left'); 
      break; 

     case 68: //right (d) 

      console.log('right'); 
      break; 

     } 
    }); 

的问题是,如果我按住一个键,过了一小会触发多个倍。 我该如何防止这种行为?我正在谷歌浏览器上运行我的代码

+1

** keydown **当用户按下某个键时触发。它在用户保持按下的状态下重复。 **按键**当一个实际的字符被插入时触发,例如,一个文本输入。它在用户保持按下的状态下重复。 ** keyup **当用户释放一个键时,在该键的默认操作完成后触发。 http://keyserver.com/a/13127566/297641 –

+0

'.keyup()'将是正确的选择4肯定.... – Jai

+0

@Jai:'keyup'是解决方案的*部分*,但只是从'keydown'到'keyup'可能会不受用户欢迎。 –

回答

7

这是关键重复。你能打败它,如果你想,通过记住,你已经知道,关键是降:

// A map to remember in 
var keysdown = {}; 

// keydown handler 
$(document).keydown(function(e){ 

    // Do we already know it's down? 
    if (keysdown[e.keyCode]) { 
     // Ignore it 
     return; 
    } 

    // Remember it's down 
    keysdown[e.keyCode] = true; 

    // Do our thing 
    switch(e.keyCode){ 
    case 65: //left (a) 

     console.log('left'); 
     break; 

    case 68: //right (d) 

     console.log('right'); 
     break; 

    } 
}); 

// keyup handler 
$(document).keyup(function(e){ 
    // Remove this key from the map 
    delete keysdown[e.keyCode]; 
}); 

附注:我认为,当你使用jQuery,e.which是更可靠的性能,如it's normalized for you by jQuery

+1

不错的解决方案。就像我抬起头一样,左/右箭头键在我所在的Mac上是37/39。不确定跨OS的keyCodes的所有规定,但认为值得一提。 –

+0

非常感谢,它工作正常!我要检查e.which API – MrColly

+0

@ DonBoots:啊,是的,[疯狂是JavaScript键盘的东西](http://unixpapa.com/js/key.html)。 –

2
var keyPressed = false; 

$(document).on('keydown', function(e) { 
    var key; 
    if (keyPressed === false) { 
    keyPressed = true; 
    key = String.fromCharCode(e.keyCode); 

    //this is where you map your key 
    if (key === 'X') { 
     console.log(key); 
     //or some other code 
    } 
    } 
    $(this).on('keyup', function() { 
    if (keyPressed === true) { 
     keyPressed = false; 
     console.log('Key no longer held down'); 
     //or some other code 
    } 
    }); 
});