Bagaimana cara mendeteksi tombol escape dengan JS atau jQuery murni?

524

Kemungkinan Duplikat:
Kode kunci mana untuk tombol melarikan diri dengan jQuery

Bagaimana cara mendeteksi tombol escape di IE, Firefox dan Chrome? Kode di bawah ini berfungsi di IE dan lansiran 27, tetapi di Firefox lansiran0

$('body').keypress(function(e){
    alert(e.which);
    if(e.which == 27){
        // Close my modal window
    }
});
Mithun Sreedharan
sumber
1
lakukan deteksi browser terlebih dahulu?
ina
7
Saya menemukan quirksmode.org selalu dapat diandalkan untuk mencari tahu apa yang berfungsi di browser mana: quirksmode.org/js/keys.html . Di sana Anda dapat menemukan itu hanya keyupatau keydowndalam kombinasi dengan keyCodekarya di semua browser.
Felix Kling
1
Saya pikir judul dari pertanyaan ini adalah "Bagaimana mendeteksi escape key press dengan jquery?" Atau jawabannya harus dalam javascript asli ...
Wilt
3
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);});Salam dari 2014
Kalle H. Väravas

Jawaban:

957

Catatan: keyCodeini semakin usang digunakan keysebagai gantinya.

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

Ini jsfiddle


keyCode Semakin ditinggalkan

Tampaknya keydowndan keyupberhasil, meskipun keypressmungkin tidak


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

Kode kunci untuk tombol melarikan diri dengan jQuery

Jigar Joshi
sumber
11
untuk melepaskan ikatan: $ (dokumen) .unbind ("keyup", keyUpFunc);
Plattsy
54
Untuk melepaskan ikatan, Anda juga dapat menggunakan namespace di acara tersebut, $(document).on('keyup.unique_name', ...)dan$(document).unbind('keyup.unique_name')
Lachlan McD.
9
Disarankan untuk menggunakan e.which (bukan e.keycode) untuk memeriksa tombol mana yang ditekan. jQuery menormalkan kode kunci dan kode sandi (digunakan pada browser lama)
DMTintner
1
@DMTintner: pada subjek yang sama, lihat komentar yang ditinggalkan oleh Jordan Brough stackoverflow.com/a/1160109/759452
Adrien Be
8
Anda harus selalu menggunakannya ===.
pmandell
211

The keydownAcara akan bekerja dengan baik untuk melarikan diri dan memiliki manfaat yang memungkinkan Anda untuk menggunakan keyCodedi semua browser. Juga, Anda perlu melampirkan pendengar documentdaripada tubuh.

Perbarui Mei 2016

keyCode sekarang sedang dalam proses menjadi usang dan sebagian besar browser modern menawarkan key properti sekarang, meskipun Anda masih akan membutuhkan mundur untuk dukungan browser yang layak untuk saat ini (saat menulis rilis Chrome dan Safari saat ini tidak mendukungnya).

Pembaruan September 2018 evt.key sekarang didukung oleh semua browser modern.

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

Tim Down
sumber
3
Catatan, Anda juga bisa menambahkan pendengar ke <input>elemen dan karenanya hanya akan dipicu ketika elemen ini memiliki fokus.
Mike
1
@Ranmocy: Elemen apa itu (elemen yang memiliki ID 'test')? Hanya elemen yang mampu menerima fokus (form input, elemen contenteditable, elemen dengan set tabindex) peristiwa kunci.
Tim Down
1
Anda juga dapat memeriksa if (evt.key === 'Escape') {alih-alih menggunakan yang sudah usangkeyCode
Keysox
1
@tobymackenzie: Begitulah. Bukankah itu luar biasa? Selamat datang di dunia baru pengembangan web berbasis standar yang berani.
Tim Down
1
Jika Anda ingin tahu apakah Anda dapat menggunakan dengan aman .key, lihat caniuse.com/#feat=keyboardevent-key
Jasper de Vries
37

Menggunakan JavaScript, Anda dapat melakukan pemeriksaan jsfiddle

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

Menggunakan jQuery, Anda dapat melakukan pemeriksaan jsfiddle

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

periksa keyCode&& which& keyup||keydown

$(document).keydown(function(e){
   var code = e.keyCode || e.which;
   alert(code);
});
jandy
sumber
saya melihat ini tidak berfungsi, jsfiddle.net/GWJVt hanya untuk melarikan diri ... tampaknya canggung?
Reigel
$ (document.body) .keypress () tidak diaktifkan
Mithun Sreedharan
@ Reigel: memang, tampaknya tidak berfungsi dengan baik dengan menekan tombol. Apa pun, aku tidak bisa membayangkan bagian 'canggung'.
jAndy
3
KeyPress dinaikkan untuk tombol karakter (tidak seperti KeyDown dan KeyUp, yang juga dinaikkan untuk tombol noncharacter) ketika tombol ditekan.
Marta
7

Cara terbaik adalah membuat fungsi untuk ini

FUNGSI:

$.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);
            };
        });
    });
};

CONTOH:

$("#my-div").escape(function () {
    alert('Escape!');
})
Ivijan Stefan Stipic
sumber
4
Sebenarnya, sepertinya itu keypresstidak menyala pada tombol pelarian. Paling tidak, tidak di Chrome di Mac.
samson
1
Terima kasih atas umpan balik ini, saya membuat pembaruan dan mengubah aturan. keydownperbaiki masalah.
Ivijan Stefan Stipic
Saya memperbarui solusi Anda untuk dapat mendukung penggunaan 'hanya sekali'. Berikut ini sebuah contoh: jsfiddle.net/oxok5x2p .
dh
6

Di bawah ini adalah kode yang tidak hanya menonaktifkan kunci ESC tetapi juga memeriksa kondisi di mana ia ditekan dan tergantung pada situasinya, ia akan melakukan tindakan atau tidak.

Dalam contoh ini,

e.preventDefault();

akan menonaktifkan aksi tekan tombol ESC.

Anda dapat melakukan sesuatu seperti menyembunyikan div dengan ini:

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

Di mana tombol ESC ditekan juga dipertimbangkan:

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

Anda dapat menghapus bagian ini jika syarat jika Anda ingin menerapkan ini untuk semua. Atau Anda dapat menargetkan INPUT di sini untuk hanya menerapkan tindakan ini ketika kursor berada di kotak 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);
Tarik
sumber
0

saya pikir cara paling sederhana adalah vanilla javascript:

document.onkeyup = function(event) {
   if (event.key === 27){
     //do something here
   }
}
Duan Walker
sumber
6
Pada chrome saya (Versi 55.0.2883.95 (64-bit)) saya mendapatkan Escapesebagai event.keydan tidak 27
MosheZada
Seharusnya event.keyCode27 tahun.
Jens Törnell