JS / jQueryでの矢印キーのバインド


418

JavaScriptやjQueryの左右の矢印キーに関数をバインドするにはどうすればよいですか?私はjQueryのjs-hotkeyプラグインを見ました(組み込みのバインド関数をラップして、特定のキーを認識するための引数を追加します)が、矢印キーをサポートしていないようです。


回答:


541
document.onkeydown = function(e) {
    switch(e.which) {
        case 37: // left
        break;

        case 38: // up
        break;

        case 39: // right
        break;

        case 40: // down
        break;

        default: return; // exit this handler for other keys
    }
    e.preventDefault(); // prevent the default action (scroll / move caret)
};

IE8をサポートする必要がある場合は、関数本体をとして開始しますe = e || window.event; switch(e.which || e.keyCode) {


(2020を編集)現在は非推奨である
ことに注意してくださいKeyboardEvent.which。矢印キーを検出する最新のソリューションについては、この例を使用KeyboardEvent.keyしてください。


28
最善の答えです。用途e.whichjQueryのように、クロスブラウザのために推奨しています用途e.preventDefault()の代わりにreturn falsereturn falsejQueryのイベントハンドラをトリガに両方e.preventDefault()e.stopPropagation()、第二は、イベントがそれらに伝播しないので失敗し、それ以降の追加イベントを引き起こすことが起こっている)、および時スイッチの終わり。他のキーの使用を妨げないように、探しているキー以外のキーである場合は、呼び出しをせずに戻りe.preventDefault()ます。代わり$.ui.keyCode.DOWNに、数値と比較します(はるかに高速)。
Jimbo Jonny

2
ネイサン:すべてのキーコードがブラウザ間で一貫しているわけではないようですが、矢印キーはその一部です。ここを参照してください:stackoverflow.com/questions/5603195/...
Sygmoral

1
@MichaelScheper-1)変数!=定数(変更するかどうかに関係なく)... jQueryが定数を使用できるようにES6定数が遍在するようになるまで、エンジンは変数のようにそれらを処理する必要があります2)数値はそうではありません彼らの真横にコメントがあり、それらが何であるかを正確に伝えているときの本当に魔法の数字、そして3)...続き
神保ジョニー

2
... 3)アクセスしたとき$.ui.keyCode.DOWN、あなたが探して$、それを見つけるのレベルを上がっていく...を探して、あなたのレキシカルスコープではありません$グローバルスコープ内になるまで繰り返し、グローバルでそれを見つけwindow、アクセス$、アクセスをウィンドウ上uiwindow.$アクセス、keyCodewindow.$.uiにアクセスDOWNwindow.$.ui.keyCodeて、比較するプリミティブ値にアクセスし、実際の比較を行います。その速度が重要かどうかは個人的な決断ですが、プリミティブを簡単に記述/コメントできる状況では、4レベルのアクセスを回避する傾向があります。
Jimbo Jonny

1
@NathanArthurは、ここで私は、キーボードのキーコードをテストするために、2つの優れたオンラインツールを見つけました:keycode.info asquare.net/javascript/tests/KeyCode.html unixpapa.com/js/key.html
リッカルド・ヴォルペ

451
$(document).keydown(function(e){
    if (e.which == 37) { 
       alert("left pressed");
       return false;
    }
});

文字コード:

37-左

38歳以上

39-右

40-ダウン


4
返品の目的はありますか?
Alex S

19
それ以上ヒットするキーダウンイベントを停止します。
s_hewitt

9
シャドウ:いいえ、彼はそれが他のDOM要素に発射からのKeyDownイベントを中止する意味
JasonWoof

3
39以外はアポストロフィですよね。
ポールD.ウェイト

25
jQueryを使用e.whichする場合はe.keyCode、より多くのブラウザーサポートではなくを使用してください。以下の私のコメントを参照してください。
シグモラル2012年

108

矢印キーのkeyCodeを使用できます(左、上、右、下の37、38、39、40)。

$('.selector').keydown(function (e) {
  var arrow = { left: 37, up: 38, right: 39, down: 40 };

  switch (e.which) {
    case arrow.left:
      //..
      break;
    case arrow.up:
      //..
      break;
    case arrow.right:
      //..
      break;
    case arrow.down:
      //..
      break;
  }
});

上記の例をここで確認してください。


1
||の使用についてはよくわかりません 2行目の演算子。ゼロまたはゼロ以外の実装固有の値ではなく、保証されていませんか?次のようなものを使用します。var keyCode =(e.keyCode?e.keyCode:e.which); +1は、矢印オブジェクトを使用して、判読可能な名前を付けます。
Mnebuerquo 2010

6
jQueryを使用している場合、e.whichをテストする必要はありません。The event.which property normalizes event.keyCode and event.charCode- api.jquery.com/event.which
JCM

テーブルにキーイベントリスナーを配置しようとしていますが、機能しません。キーイベントリスナーをサポートするセレクタータイプの数に制限はありますか?
Arman Bimatov 2013年

23

これは少し遅いですが、HotKeysには非常に大きなバグがあり、要素に複数のホットキーをアタッチすると、イベントが複数回実行されます。プレーンなjQueryを使用してください。

$(element).keydown(function(ev) {
    if(ev.which == $.ui.keyCode.DOWN) {
        // your code
        ev.preventDefault();
    }
});

2
uiキーコードオブジェクトを使用するための+1。37、38、39、または40よりもはるかに簡単に理解できます。jQueryのドキュメントにe.whichを使用してブラウザーの違いを説明するよう明示的に指示されているのに、なぜトップの回答がe.keyCodeを使用しているのかわかりません。うまくいけば、この答えはそれを正しく行うためのより多くの認識を得ます。
なし

2
キーを押すたびに$ .ui.keyCode.DOWNを使用すると、数値を使用する場合よりもかなり遅くなります。特に、キーが押されるたびに実行する必要があるため、わかりやすさが気になる場合はコメントを追加してください。
Jimbo Jonny、

16

私は単に他の答えから最高のものを組み合わせました:

$(document).keydown(function(e){
    switch(e.which) {
        case $.ui.keyCode.LEFT:
        // your code here
        break;

        case $.ui.keyCode.UP:
        // your code here
        break;

        case $.ui.keyCode.RIGHT:
        // your code here
        break;

        case $.ui.keyCode.DOWN:
        // your code here
        break;

        default: return; // allow other keys to be handled
    }

    // prevent default action (eg. page moving up/down)
    // but consider accessibility (eg. user may want to use keys to choose a radio button)
    e.preventDefault();
});

1
「ui」はどこから来たのですか?"TypeError:$ .ui is undefined" EDITの取得-JQuery UIがありませんでした。読み込まれました-これ以上エラーはありません。
コーダー、2013

3
彼は明らかにその列挙型が必要なjQuery UIも使用しています。そのためだけにjQuery UIは含めません。
Jethro Larson、

14

KeyboardJSを使用できます。このようなタスク用のライブラリを作成しました。

KeyboardJS.on('up', function() { console.log('up'); });
KeyboardJS.on('down', function() { console.log('down'); });
KeyboardJS.on('left', function() { console.log('right'); });
KeyboardJS.on('right', function() { console.log('left'); });

ここでライブラリをチェックアウト=> http://robertwhurst.github.com/KeyboardJS/



9

jQuery.HotKeysが矢印キーをサポートしていませんか?以前にデモをいじって、IE7、Firefox 3.5.2、Google Chrome 2.0.172でテストしたときに、左、右、上、下の動作を観察しました...

編集:jquery.hotkeysがGithubに再配置されたようです:https//github.com/jeresig/jquery.hotkeys


私はそれが別のライブラリに基づいていると言っているところを読んでいて、サポートされているキーのリストがまだ適用されていると想定していました。
Alex S


4

右または左に行く純粋なjsの例

        window.addEventListener('keydown', function (e) {
            // go to the right
            if (e.keyCode == 39) {

            }
            // go to the left
            if (e.keyCode == 37) {

            }
        });

3

jQuery bindを使用できます。

$(window).bind('keydown', function(e){
    if (e.keyCode == 37) {
        console.log('left');
    } else if (e.keyCode == 38) {
        console.log('up');
    } else if (e.keyCode == 39) {
        console.log('right');
    } else if (e.keyCode == 40) {
        console.log('down');
    }
});

2

次の方法arrow keyで押されているかどうかを確認できます。

$(document).keydown(function(e){
    if (e.keyCode > 36 && e.keyCode < 41) { 
       alert( "arrowkey pressed" );
       return false;
    }
});

0

矢印は、他のオブジェクトのSELECTでのみ使用できるようにします。まあ、実際には別のオブジェクトのLOLを使用していません。しかし、ページ上の矢印イベントと入力タイプを停止できます。

「kepress」、「keydown」、「keyup」イベントで「e.preventDefault()」または「return false」を使用して、矢印を左右にブロックしてSELECTオブジェクトの値を変更しようとしましたが、それでもオブジェクトの値は変更されます。しかし、イベントはまだ矢印が押されたことを通知します。


0

キーボード入力と入力されたキーの組み合わせをキャプチャするための堅牢なJavascriptライブラリ。依存関係はありません。

http://jaywcjlove.github.io/hotkeys/

hotkeys('right,left,up,down', function(e, handler){
    switch(handler.key){
        case "right":console.log('right');break
        case "left":console.log('left');break
        case "up":console.log('up');break
        case "down":console.log('down');break
    }
});

0

ユーザーが入力に集中しているときに、矢印キーを使用して数値入力を+1または-1する簡単な方法を探してここに来ました。私は良い答えを見つけることはできませんでしたが、うまくいくように見える次のコードを作成しました-現在、このサイト全体に適用しています。

$("input").bind('keydown', function (e) {
    if(e.keyCode == 40 && $.isNumeric($(this).val()) ) {
        $(this).val(parseFloat($(this).val())-1.0);
    } else if(e.keyCode == 38  && $.isNumeric($(this).val()) ) { 
        $(this).val(parseFloat($(this).val())+1.0);
    }
}); 

-1

コーヒーとjquery

  $(document).on 'keydown', (e) ->
    switch e.which
      when 37 then console.log('left key')
      when 38 then console.log('up key')
      when 39 then console.log('right key')
      when 40 then console.log('down key')
    e.preventDefault()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.