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

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


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


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

17

periksa keyCode&& which& keyup||keydown

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

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!');
})

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);

0

saya pikir cara paling sederhana adalah vanilla javascript:

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.