2

keydown と keypress を試しましたが、ユーザーがキーを保持している場合、両方とも常に起動します。ユーザーがキーを押したとき (押されていない状態から押された状態に変わる) だけをリッスンする方法はありますか?

これは、どのキーがダウンしているかを確認するために使用しているものです。

$(document).keydown(function (e){
    console.log(e.which);
});
4

2 に答える 2

1

の最初の呼び出しでkeydownkeydownハンドラのバインドを解除してから、 で再バインドできkeyupます。

// keydown is bound at load
$(document).keydown(function (e){
    // Call function
    doStuff();
});

// keyup rebinds the keydown event.
$(document).keyup(function(e) {
   $(document).keydown(function(e) {
     doStuff();
   });
});

// The function called on keydown does something
// and then unbinds the keydown event
function doStuff() {
   console.log("Doing stuff");
   // And unbind it...
    $(document).unbind('keydown');
}

http://jsfiddle.net/cbSRu/2/

于 2012-12-14T00:09:01.963 に答える
0

これは私が最終的に使用したものです。良いことは、ループを追加してすべてのキーまたはそれらの一部だけに影響を与えるようにできることです:

var keys = {};
var keyPressed = {};
$(document).keydown(function (e){
    if(!keyPressed[e.which]) { keyPressed[e.which] = true; keys[e.which] = true; } // If you add disableKey(e.which) here all keys are listened only once
});
$(document).keyup(function (e){
    delete keys[e.which];
    delete keyPressed[e.which];
});
function disableKey(n) {
    delete keys[n];
}
// Adding this function enables you to disable keys individually (probably have something like this anyway to differenciate keys)
function doStuff() {
    if(keys[65]) { console.log('attack'); disableKey(65); } // Disable key 65
    if(keys[83]) { console.log('jump'); }
    setTimeout(function(){doStuff()},100);
}
doStuff();​

http://jsfiddle.net/cbSRu/6/

于 2012-12-14T01:13:58.777 に答える