Come rilevare la pressione del tasto Esc con JS o jQuery puro?


524

Possibile duplicato:
quale codice chiave per chiave di escape con jQuery

Come rilevare la chiave di escape premere in IE, Firefox e Chrome? Il codice seguente funziona in IE e avvisi 27, ma in Firefox avvisa0

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

1
fare prima un po 'di rilevamento del browser?
ina,

7
Trovo quirksmode.org sempre affidabile per scoprire cosa funziona in quale browser: quirksmode.org/js/keys.html . Lì puoi trovarlo solo keyupo keydownin combinazione con keyCodefunziona in tutti i browser.
Felix Kling,

1
Penso che il titolo di questa domanda dovrebbe essere "Come rilevare la chiave di escape premere con jquery?" O le risposte dovrebbero essere in javascript nativo ...
Wilt

3
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);});Saluti dal 2014
Kalle H. Väravas

Risposte:


957

Nota: keyCodesta diventando obsoleto l'uso key, invece.

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

Qui è jsfiddle


keyCode sta diventando deprecato

Sembra keydowne keyupfunziona, anche se keypresspotrebbe non esserlo


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

Quale codice chiave per chiave di escape con jQuery


11
per separare: $ (document) .unbind ("keyup", keyUpFunc);
Plattsy,

54
Per separarti puoi anche usare uno spazio dei nomi sull'evento $(document).on('keyup.unique_name', ...)e$(document).unbind('keyup.unique_name')
Lachlan McD.

9
Si consiglia di utilizzare e.which (anziché e.keycode) per verificare quale tasto è stato premuto. jQuery normalizza keycode e charcode (utilizzati nei browser meno recenti)
DMTintner

1
@DMTintner: sullo stesso argomento, vedi il commento lasciato da Jordan Brough stackoverflow.com/a/1160109/759452
Adrien,

8
Dovresti sempre usare ===.
pmandell,

211

L' keydownevento funzionerà perfettamente con Escape e ha il vantaggio di permetterti di utilizzarlo keyCodein tutti i browser. Inoltre, è necessario collegare l'ascoltatore documentpiuttosto che il corpo.

Aggiornamento maggio 2016

keyCodeè ora in procinto di essere deprecato e la maggior parte dei browser moderni offre la keyproprietà ora, anche se per ora avrai ancora bisogno di un fallback per un supporto decente del browser (al momento della stesura delle versioni correnti di Chrome e Safari non lo supportano).

L'aggiornamento settembre 2018 evt.key è ora supportato da tutti i browser moderni.

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
Nota, puoi anche aggiungere il listener a un <input>elemento e sarà quindi attivato solo quando questo elemento ha lo stato attivo.
Mike,

1
@Ranmocy: che tipo di elemento è (quello con ID 'test')? Solo gli elementi in grado di ricevere focus (input di modulo, elementi contenteditable, elementi con tabindex set) attivano gli eventi chiave.
Tim Down

1
Puoi anche controllare if (evt.key === 'Escape') {invece di usare il deprecatokeyCode
Keysox

1
@tobymackenzie: Così è. Non è meraviglioso? Benvenuti nel nuovo coraggioso mondo dello sviluppo web basato su standard.
Tim Down

1
Se vuoi sapere se puoi usare in sicurezza .key, vedi caniuse.com/#feat=keyboardevent-key
Jasper de Vries

37

Usando JavaScript puoi controllare jsfiddle funzionante

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

Usando jQuery puoi controllare jsfiddle funzionante

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

17

controlla keyCode&& which& keyup||keydown

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

vedo che non funziona, jsfiddle.net/GWJVt solo per la fuga ... sembra imbarazzante?
Reigel,

$ (document.body) .keypress () non si attiva
Mithun Sreedharan,

@Reigel: in effetti, sembra non funzionare correttamente con la pressione dei tasti. Comunque, non riesco a capire la parte 'imbarazzante'.
jAndy,

3
KeyPress viene generato per i tasti carattere (a differenza di KeyDown e KeyUp, che vengono generati anche per i tasti non di carattere) mentre il tasto viene premuto.
Marta,

7

Il modo migliore è di far funzionare questo

FUNZIONE:

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

ESEMPIO:

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

4
In realtà, sembra che keypressnon si attivi sulla chiave di escape. Almeno, non in Chrome su un Mac.
Sansone,

1
Grazie per questo feedback, ho fatto un aggiornamento e ho cambiato la regola. keydownrisolvi il problema.
Ivijan Stefan Stipić,

Ho aggiornato la tua soluzione per essere in grado di supportare un utilizzo "solo una volta". Ecco un esempio: jsfiddle.net/oxok5x2p .
dh

6

Di seguito è riportato il codice che non solo disabilita il tasto ESC, ma controlla anche la condizione in cui viene premuto e, a seconda della situazione, eseguirà o meno l'azione.

In questo esempio,

e.preventDefault();

disabiliterà l'azione di pressione del tasto ESC.

Puoi fare qualcosa di simile a nascondere un div con questo:

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

Se si tiene conto anche del tasto ESC premuto:

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

È possibile rimuovere questa parte se condizione se si desidera applicare a tutto questo. Oppure puoi scegliere come target INPUT qui per applicare questa azione solo quando il cursore si trova nella casella di 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

penso che il modo più semplice sia vaniglia javascript:

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

6
Sul mio cromato (versione 55.0.2883.95 (64-bit)) ottengo Escapecome event.keye non 27
MosheZada

Dovrebbe essere il event.keyCode27.
Jens Törnell il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.