keydown と keypress を試しましたが、ユーザーがキーを保持している場合、両方とも常に起動します。ユーザーがキーを押したとき (押されていない状態から押された状態に変わる) だけをリッスンする方法はありますか?
これは、どのキーがダウンしているかを確認するために使用しているものです。
$(document).keydown(function (e){
console.log(e.which);
});
keydown と keypress を試しましたが、ユーザーがキーを保持している場合、両方とも常に起動します。ユーザーがキーを押したとき (押されていない状態から押された状態に変わる) だけをリッスンする方法はありますか?
これは、どのキーがダウンしているかを確認するために使用しているものです。
$(document).keydown(function (e){
console.log(e.which);
});
の最初の呼び出しでkeydown
、keydown
ハンドラのバインドを解除してから、 で再バインドでき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');
}
これは私が最終的に使用したものです。良いことは、ループを追加してすべてのキーまたはそれらの一部だけに影響を与えるようにできることです:
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();