9

私は多くの関連する質問を見つけました (ここと他の場所) が、これは特に見つかりませんでした。

矢印キー (37-40) のキーダウン イベントをリッスンしようとしていますが、特定の順序で矢印キーを使用すると、後続の矢印は「キーダウン」イベントを生成しません。

例: http://blog.pothoven.net/2008/05/keydown-vs-keypress-in-javascript.html

  1. そのページで、「ここに入力 ->」ボックスをクリックします。
  2. 右矢印キーを長押し: テーブルがキーコード 39 に更新されます
  3. 右矢印キーを押したまま、上矢印キーを押したままにします。テーブルは 38 に更新されます。
  4. 右矢印キーと上矢印キーを押したまま、左矢印キーを押したままにします: テーブルは更新されません

ただし、上矢印キーの代わりに矢印キーを使用して同じことを行うと、期待どおりに機能します。

さらに、矢印キーの代わりにキーパッドを使用すると、期待どおりに機能します。

keydown イベントの通常の操作を妨げています (イベント リスナーで false を返すことと、 preventDefault() を呼び出すことの両方によって) が、動作は持続します。

私のキーボードかもしれないと思ったのですが、ラップトップだけでなく友人のマシンでも起こります。

何が起こっているかについて誰かが何か洞察を持っていますか? または、回避策に関するいくつかの良いアイデアはありますか?

[編集] これが私の言いたいことの例です。これはすべてのブラウザーで機能するとは限りませんが、ラップトップでこれをまとめて、何が起こっているかを示しました (w7 の chrome と mac os 10.6.8 の chrome & safari)。

<html>
<body>
<script>

var keysDown = {};
addEventListener("keydown", function(e) {
    keysDown[e.keyCode] = true;
    document.getElementById('latestKeydown').value=e.keyCode;
}, false);

addEventListener("keyup",function(e){
    delete keysDown[e.keyCode];
}, false);

var loop = function(){
    document.getElementById('upinput').value=keysDown[38];
    document.getElementById('downinput').value=keysDown[40];
    document.getElementById('leftinput').value=keysDown[37];
    document.getElementById('rightinput').value=keysDown[39];
}

setInterval(loop,1);

</script>
Up: <input id="upinput" type=text size=10><br />
Down: <input id="downinput" type=text size=10><br />
Left: <input id="leftinput" type=text size=10><br />
Right: <input id="rightinput" type=text size=10><br />
Recent Keydown: <input id="latestKeydown" type=text size=10><br />

</body>
</html>

繰り返しますが、問題は次のとおりです。A、S、D、F、G の順に押すと、新しいキーを押し始めるたびに「Recent Keydown」が更新されるのがわかります。

ただし、右矢印、上矢印、左矢印の順に押したままにすると、左矢印キーの「最近のキーダウン」が更新されません。

4

1 に答える 1

4

これについての権限について話すことはできませんが、https://stackoverflow.com/a/4177260/562209によると、修飾キーと非修飾キーを同時に押して作業している場合を除き、複数のキーを押す「キーボードの配線方法が原因で、PCが認識できない場合があります」。

于 2012-04-22T06:04:47.197 に答える