2013-10-29 53 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 
    } 
    }); 
});