純粋なJSまたはjQueryでエスケープキーの押下を検出する方法


524

重複の可能性:
jQueryでのエスケープキーのキーコード

IE、Firefox、Chromeでエスケープキーの押下を検出する方法 以下のコードはIEと警告27で機能しますが、Firefoxでは警告します0

$('body').keypress(function(e){
    alert(e.which);
    if(e.which == 27){
        // Close my modal window
    }
});

1
最初にブラウザを検出しますか?
INA

7
quirksmode.org/js/keys.htmlのように、どのブラウザーで何が機能するかを確認するには、quirksmode.orgが常に信頼できると思います。そこでは、すべてのブラウザでのみ、keyupまたはそれkeydownと組み合わせてkeyCode動作することがわかります。
Felix Kling、2010

1
この質問のタイトルは、「jqueryでエスケープキーが押されたことを検出する方法は?」または、答えはネイティブJavaScriptである必要があります...
Wilt

3
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);});2014年からのご挨拶
Kalle H.Väravas

回答:


957

注:keyCodeされた非推奨になっ使用をkey代わりに。

function keyPress (e) {
    if(e.key === "Escape") {
        // write your logic here.
    }
}

ここにjsfiddleがあります


keyCode 廃止予定です

それはそうですkeydownkeyupしても、仕事keypressではないかもしれません


$(document).keyup(function(e) {
     if (e.key === "Escape") { // escape key maps to keycode `27`
        // <DO YOUR WORK HERE>
    }
});

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


11
バインドを解除するには:$(document).unbind( "keyup"、keyUpFunc);
Plattsy、2013年

54
バインド解除するには、イベントの名前空間を使用し、できる$(document).on('keyup.unique_name', ...)$(document).unbind('keyup.unique_name')
ラクランマキシシングル。

9
どのキーが押されたかを確認するには、e.keycodeの代わりにe.whichを使用することをお勧めします。jQueryはキーコードと文字コードを正規化します(古いブラウザで使用されていました)
DMTintner '18

1
@DMTintner:同じテーマについて、Jordan Broughが残したコメントを参照してくださいstackoverflow.com/a/1160109/759452
Adrien Be

8
常に使用する必要があります===
pmandell 2016

211

このkeydownイベントはEscapeで正常にkeyCode機能し、すべてのブラウザーで使用できるという利点があります。また、リスナーをdocumentボディではなくに取り付ける必要があります。

2016年5月の更新

keyCodeは現在廃止されており、ほとんどの最新のブラウザがこのkeyプロパティを提供していますが、現時点ではまともなブラウザサポートのフォールバックが必要です(現在のリリースのChromeとSafariはサポートしていません)。

2018年9月の更新 evt.keyがすべての最新ブラウザーでサポートされるようになりました。

document.onkeydown = function(evt) {
    evt = evt || window.event;
    var isEscape = false;
    if ("key" in evt) {
        isEscape = (evt.key === "Escape" || evt.key === "Esc");
    } else {
        isEscape = (evt.keyCode === 27);
    }
    if (isEscape) {
        alert("Escape");
    }
};
Click me then press the Escape key


3
リスナーを<input>要素に追加することもできます。そのため、この要素にフォーカスがある場合にのみトリガーされます。
マイク

1
@Ranmocy:それはどのような要素(ID 'test'を持つ要素)ですか?フォーカスを受け取ることができる要素(フォーム入力、contenteditable要素、tabindexが設定された要素)のみがキーイベントを発生させます。
ティム・ダウン

1
またif (evt.key === 'Escape') {、非推奨keyCode
Keysox

1
@tobymackenzie:そうです。それは驚くべきことではありませんか?標準ベースのWeb開発の勇敢で新しい世界へようこそ。
Tim Down

1
安全に使用できるかどうかを知りたい場合は.keycaniuse.com
Jasper de Vries

37

JavaScriptを使用すると、動作しているjsfiddleを確認できます

document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.keyCode == 27) {
        alert('Esc key pressed.');
    }
};

jQueryを使用すると、動作しているjsfiddleを確認できます

jQuery(document).on('keyup',function(evt) {
    if (evt.keyCode == 27) {
       alert('Esc key pressed.');
    }
});

17

チェックkeyCode&& whichkeyup||keydown

$(document).keydown(function(e){
   var code = e.keyCode || e.which;
   alert(code);
});

jsfiddle.net/GWJVtがエスケープのためだけに機能していないように見えます...
レイゲル

$(document.body).keypress()が起動しない
Mithun Sreedharan

@Reigel:確かに、キーを押しても正しく動作しないようです。とにかく、「ぎこちない」部分がわからない。
jAndy

3
キーが押されている間、KeyPressは文字キーに対して発生します(KeyDownおよびKeyUpは非文字キーに対しても発生します)。
マルタ

7

最善の方法は、これを機能させることです

関数:

$.fn.escape = function (callback) {
    return this.each(function () {
        $(document).on("keydown", this, function (e) {
            var keycode = ((typeof e.keyCode !='undefined' && e.keyCode) ? e.keyCode : e.which);
            if (keycode === 27) {
                callback.call(this, e);
            };
        });
    });
};

例:

$("#my-div").escape(function () {
    alert('Escape!');
})

4
実際には、それkeypressはエスケープキーでは発火しないようです。少なくとも、MacのChromeではできません。
samson、

1
このフィードバックのおかげで、更新と変更のルールを作成しました。keydown問題を解決します。
Ivijan StefanStipić2015

「1回のみ」の使用をサポートできるようにソリューションを更新しました。次に例を示します:jsfiddle.net/oxok5x2p
2016

6

以下は、ESCキーを無効にするだけでなく、それが押された状態をチェックし、状況に応じてアクションを実行するかどうかを決定するコードです。

この例では、

e.preventDefault();

Escキーを押すアクションを無効にします。

あなたはこれでdivを隠すような何かをするかもしれません:

document.getElementById('myDivId').style.display = 'none';

ESCキーが押された場合も考慮されます:

(e.target.nodeName=='BODY')

これをすべてに適用したい場合は、条件部分のifを削除できます。または、ここでINPUTをターゲットにして、カーソルが入力ボックス内にあるときにのみこのアクションを適用することもできます。

window.addEventListener('keydown', function(e){
    if((e.key=='Escape'||e.key=='Esc'||e.keyCode==27) && (e.target.nodeName=='BODY')){
        e.preventDefault();
        return false;
    }
}, true);

0

私は最も簡単な方法はバニラのjavascriptだと思います:

document.onkeyup = function(event) {
   if (event.key === 27){
     //do something here
   }
}

6
私のクロム(バージョン55.0.2883.95(64ビット))上の私が手Escapeとしてevent.key27及びません
MosheZada

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