5

状況:どのキーが押されたかを示すかなり標準的なkeydownハンドラーがありますが、いずれかのキーを押したままにすると、(キーが実際に押されたときに 1 回だけではなく) 繰り返し発生します。switchkeydown

なぜ問題なのか: リスナーをアクティブに保ちたいkeydown、つまり、一度に複数のキーが押されたことを検出できるようにしたいのですが、イベントは 1 回につき 1 回だけ発生させkeydownます。keyupダウンとアップの間の時間に基づいてそのために何かをしたいのですkeyCodeが、そのタイミングは複数回の発火のために台無しになっています.

私が試したこと:現在、ダウンしているリストを保持しており、リストにある場合にデフォルトの動作が発生しないように、ハンドラー内のリストkeyCodesをチェックしています。ただし、イベントは依然として非常に頻繁に発生しており、このソリューションの効率/優雅さが心配です。keydownkeyCode

実際の質問:キーが物理的に押し下げられたときだけkeydownにイベントの発生を制限したり、特定のキーコードのみをリッスンしたりする良い方法はありますか?

4

4 に答える 4

9

keydown ハンドラーで、キーが最後に処理されたキーと同じかどうかを確認します。その場合は、早めに退出してください。キーアップ時に、最後に処理されたキーを忘れます。

例えば:

var lastEvent;
var heldKeys = {};

window.onkeydown = function(event) {
    if (lastEvent && lastEvent.keyCode == event.keyCode) {
        return;
    }
    lastEvent = event;
    heldKeys[event.keyCode] = true;
};

window.onkeyup = function(event) {
    lastEvent = null;
    delete heldKeys[event.keyCode];
};​

デモはこちら(「結果」パネルをクリックしてキーを押してください)。

于 2012-05-06T01:15:49.517 に答える
0

あなたが達成したいと思うことの例を次に示します: jsFiddle の例

現在、検出されるのは CTRL+B の組み合わせだけです。いくつかの数字を押すだけで、アクティビティのログを取得できます。キーがすでに押されている場合、ホールド アクションが検出されます。

于 2012-05-06T00:36:21.263 に答える
0

キーが押された場合に記録するブール値を定義します。キーダウン イベントで true に設定します。値が true かどうかをメイン ループで確認してイベントを処理し、押されたキーを false に設定します。キーが離された場合に記録する別のブール値があります (最初は false)。キーアップ イベントが発生した場合は、リリース済みに設定します。"released" 値も true である場合にのみ、key-pressed 値を true に設定します (キー ダウン イベントで)。

于 2012-05-05T23:55:22.603 に答える