jQueryでのエスケープキーのキーコード


559

2つの機能があります。Enterキーを押すと関数は正しく実行されますが、Escapeキーを押すと機能しません。エスケープキーの正しい番号は何ですか?

$(document).keypress(function(e) { 
    if (e.which == 13) $('.save').click();   // enter (works as expected)
    if (e.which == 27) $('.cancel').click(); // esc   (does not work)
});

Keypressは、キーに接続された文字(正しい大文字など)を返します。Keyupは、押されたハードウェアボタンの数を返します。ESCの場合、ハードウェ
アコード


あなたが欲しいkeyCodeを見つけるための本当に簡単なトリックがあります。新しいタブを開き、document.addEventListener("keydown", e => console.log(e.keyCode))ブラウザコンソールに入れ、ウィンドウをクリックして、探しているキーを押してください。
anarchist912

回答:


926

keyupイベントで試してください:

$(document).keyup(function(e) {
  if (e.keyCode === 13) $('.save').click();     // enter
  if (e.keyCode === 27) $('.cancel').click();   // esc
});

39
これはkeyupとkeypressには関係ありません。ESCAPEをキャプチャするには、e.which(この例では偶然)とは対照的にe.keyCodeを調べる必要があります。
dkamins

211
「これはkeyupとkeypressには関係ありません」-それは正しくありません、dkamins。keypressがブラウザー間で一貫して処理されていないようです(IE対Chrome対Firefoxのapi.jquery.com/keypressでデモを試してください-登録されない場合があり、「which」と「keyCode」の両方が異なります)キーアップは一貫しています。e.whichはjqueryで正規化された値なので、「which」または「keyCode」はどちらもキーアップで機能します。
ジョーダンブロー

13
@Jordan Brough-人々がそれを読んであなたのコメントの実際の意味を理解できるように、コメントとして回答として投稿することをリクエストしたいと思います!あなたのコメントは説明する答えと同じくらい重要なので
Murtaza

15
keydownネイティブの動作を模倣します-少なくともWindowsでは、ダイアログでEscキーまたはReturnキーを押すと、キーが離される前にアクションがトリガーされます。
thomthom 2012年

2
@gibberish回答をここに回答として追加しました:stackoverflow.com/a/28502629/58876
ジョーダンブロ

77

関数のキーコード値をハードコードするのではなく、名前付き定数を使用して、意味をより適切に伝えることを検討してください。

var KEYCODE_ENTER = 13;
var KEYCODE_ESC = 27;

$(document).keyup(function(e) {
  if (e.keyCode == KEYCODE_ENTER) $('.save').click();
  if (e.keyCode == KEYCODE_ESC) $('.cancel').click();
});

一部のブラウザー(FireFoxなど、他のブラウザーでは不明)は、KeyEventこれらのタイプの定数を公開するグローバルオブジェクトを定義します。このSOの質問は、他のブラウザーでもそのオブジェクトを定義するための優れた方法を示しています。


15
えーと、27はエスケープキーであるだけで飛び出さないのですか?正直なところ、これは本当により多くの人々によって行われる必要があります。私はそれらを「マジックナンバー」と「マジックストリング」と呼びます。72の意味?コードベースに非常に具体的で揮発性の高い文字列が300回コピー貼り付けされているのはなぜですか?など
vbullinger 2012

1
または、それぞれを1回だけ使用する可能性が高いため、それぞれの上にコメントを追加することもできます。IMOも同様に読みやすい
Ivan Durst 2014年

8
@IvanDurstは、メソッドごとに1回だけ使用する可能性がありますが、私のプロジェクトでは複数回使用しています。キーコードを使用するたびに、(1)値を調べて、(2)コメントすることを本当に提案していますか?私はあなたのことは知りませんが、私はそれらを記憶したいという欲求も、他のプログラマが一貫してコメントするだろうという信念も持っていません。読みやすさだけでなく、コーディングをより簡単で一貫したものにすることです。
Seth Petry-Johnson 2014

2
彼らが何を意味するかを知っている人はコメントするために意味を調べる必要はなく、コメントを入力することは長い名前を入力するのと同じくらい簡単です。
NetMage 2014

6
文字定数を16進数でコーディングしていた古き良き時代に何が起こりましたか?誰もがESC 0x1BとEnterは知ってい0x0Dますよね?
David R Tribble 2015

42

(私の以前のコメントから抽出された回答)

keyupではなくを使用する必要がありますkeypress。例えば:

$(document).keyup(function(e) {
  if (e.which == 13) $('.save').click();     // enter
  if (e.which == 27) $('.cancel').click();   // esc
});

keypressブラウザ間で一貫して処理されていないようです(http://api.jquery.com/keypressでIEとChromeとFirefox のデモを試してください。場合によってkeypressは登録されず、 'which'と 'の両方の値がkeyCode 'は異なりますが)keyup一貫しています。

いくつかの議論があったので、e.whichVS e.keyCode注:e.whichjqueryの正規化値であり、使用のために推奨されるものであるが。

event.whichプロパティは、event.keyCodeとevent.charCodeを正規化します。キーボードのキー入力にはevent.whichを監視することをお勧めします。

http://api.jquery.com/event.which/から)


5
またkeypress、エスケープ時に起動しないブラウザが正しく動作していることもここに追加したいと思います。keypressキーが文字を生成するときにのみkeyup起動するのに対し、常に起動します。developer.mozilla.org/en-US/docs/Web/Events/keypress
ohcibi

26

任意のキーのキーコードを見つけるには、次の単純な関数を使用します。

document.onkeydown = function(evt) {
    console.log(evt.keyCode);
}

14

27エスケープキーのコードです。:)


1
Enterキーを押すと関数が正しく実行されますが、エスケープキーでは機能しない2つの関数があります。$(document).keypress(function(e){if(e.which == 13){$( '。save')。click ();} if(e.which == 27){$( '。cancel')。click();}});
Shishant 2009

$(document).keypress(function(e){y = e.keyCode?e.keyCode:e.which;}); 警告を出すと、IEとFFで27に警告します。あなたのコードに他に何か問題がないと確信していますか?
ソルティ

14

あなたの最善の策は

$(document).keyup(function(e) { 
    if (e.which === 13) $('.save').click();   // enter 
    if (e.which === 27) $('.cancel').click(); // esc   

    /* OPTIONAL: Only if you want other elements to ignore event */
    e.preventDefault();
    e.stopPropagation();
});

概要

  • whichkeyCode正規化されているためよりも
  • keyupkeydownユーザーがキーを押し続けるとキーダウンが複数回発生する可能性があるため、よりも望ましいです。
  • keypress実際のキャラクターをキャプチャしたい場合以外は使用しないでください。

興味深いことに、BootstrapはドロップダウンコンポーネントでkeydownとkeyCodeを使用しています(3.0.2以降)!私はそれはおそらくそこに悪い選択だと思います。

JQueryドキュメントの関連スニペット

ブラウザーはこの情報を格納するために異なるプロパティを使用しますが、jQueryは.whichプロパティを正規化するため、確実に使用してキーコードを取得できます。このコードは、矢印などの特殊キーのコードを含む、キーボードのキーに対応しています。実際のテキスト入力をキャッチするには、.keypress()の方が適している場合があります。

その他の興味深い項目:JavaScript Keypress Library


10

jEscapeプラグインを試してください(Googleドライブからダウンロード

$(document).escape(function() { 
   alert('ESC button pressed'); 
});

またはクロスブラウザのキーコードを取得します

var code = (e.keyCode ? e.keyCode : e.which);
if (code === 27) alert('ESC');
if (code === 13) alert('ENTER');

多分あなたはスイッチを使うことができます

var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
    case 27:
       alert('ESC');
       break;
     case 13:
       alert('ENTER');
       break;
}

8

コードは問題なく動作します。フォーカスされていない可能性が最も高いウィンドウです。同様の関数を使用してiframeボックスなどを閉じます。

$(document).ready(function(){

    // Set focus
    setTimeout('window.focus()',1000);

});

$(document).keypress(function(e) {

    // Enable esc
    if (e.keyCode == 27) {
      parent.document.getElementById('iframediv').style.display='none';
      parent.document.getElementById('iframe').src='/views/view.empty.black.html';
    }

});

8

私は同じことをやろうとしていました、そしてそれは私のがらくたを悩ませていました。Firefoxでは、エスケープキーが押されたときに何かを行おうとすると、エスケープキーの処理が続行され、実行しようとしていたことはすべてキャンセルされます。アラートは正常に機能します。しかし、私の場合、うまくいかなかった歴史に戻りたいと思いました。最後に、以下に示すように、イベントの伝播を強制的に停止する必要があることがわかりました...

if (keyCode == 27)
{
    history.back();

    if (window.event)
    {
        // IE works fine anyways so this isn't really needed
        e.cancelBubble = true;
        e.returnValue = false;
    }
    else if (e.stopPropagation)
    {
        // In firefox, this is what keeps the escape key from canceling the history.back()
        e.stopPropagation();
        e.preventDefault();
    }

    return (false);
}

8

他の答えがしていないところを説明するために; 問題はの使用ですkeypress

おそらく、イベントの名前は間違っていますkeypressが、のときに起動するように定義されています。すなわちテキスト。 一方、/は、いつでも(それぞれ前または後)起動します。つまり、キーボード上のそれらのもの。when an actualcharacteris being inserted
keydownkeyupthe user depresses akey

違いはここに表示されます。これescは、が制御文字(文字どおり「非印刷文字」)であり、テキストを書き込まないため、発生しませんkeypress
enter奇妙なのは、これを制御文字として使用している(つまり、UIを制御する)場合でも、改行文字が挿入され、が起動するためkeypressです。

ソース:quirksmode


1
スペックを読んでくれてありがとう!これは確かに受け入れられる答えになるはずです:)
DylanYoung

7

すべての文字の16進コードを取得するには:http : //asciitable.com/


2
私は言うつもりだった.....このサイトはとても醜いので、検索結果の一番上にあるのは嫌ですが、必要な情報を伝えています。
mpen 2009

1
イベントとブラウザによっては、キーコードがASCIIテーブルと常に一致するとは限りません。
アランH.

2
downvote:、質問に答えていなくても問題に対処していない、HexはESC == 27の質問とOPすでに実証された知識とは何の関係もありません
ジェレミー

7

e.keyCodeMDNで非推奨と見なされるよりも新しい回答を投稿するだけです。

e.key代わりに、すべてに対してクリーンな名前をサポートする代わりに選択する必要があります。こちらが関連コピーのパスタです

window.addEventListener("keydown", function (event) {
  if (event.defaultPrevented) {
    return; // Do nothing if the event was already processed
  }

  switch (event.key) {
    case "ArrowDown":
      // Do something for "down arrow" key press.
      break;
    case "ArrowUp":
      // Do something for "up arrow" key press.
      break;
    case "ArrowLeft":
      // Do something for "left arrow" key press.
      break;
    case "ArrowRight":
      // Do something for "right arrow" key press.
      break;
    case "Enter":
      // Do something for "enter" or "return" key press.
      break;
    case "Escape":
      // Do something for "esc" key press.
      break;
    default:
      return; // Quit when this doesn't handle the key event.
  }

  // Cancel the default action to avoid it being handled twice
  event.preventDefault();
}, true);

3
ただし、FirefoxとChromeでのみサポートされているようです。
Gayan Weerakutti 2018


残念ながら、少なくとも一部のバージョンのInternet Explorer Escは、標準ではなくコードを渡しますEscape
ロビン・スチュワート

6

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

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

hotkeys('enter,esc', function(event,handler){
    switch(handler.key){
        case "enter":$('.save').click();break;
        case "esc":$('.cancel').click();break;
    }
});

:ホットキーは以下の修飾子を理解しshiftoptionaltctrlcontrolcommand

次の特殊キーがショートカットに使用することができます:backspacetabclearenterreturnescescapespaceupdownleftrighthomeendpageuppagedowndeldeleteおよびf1通過f19


5

私は常にキーアップとe.whichを使用してエスケープキーをキャッチしました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.