Jak wykryć naciśnięcie klawisza Escape za pomocą czystego JS lub jQuery?

524

Możliwy duplikat:
Który kod dostępu do klawisza Escape w jQuery

Jak wykryć naciśnięcie klawisza Escape w IE, Firefox i Chrome? Poniższy kod działa w IE i ostrzega 27, ale w Firefox ostrzega0

$('body').keypress(function(e){
    alert(e.which);
    if(e.which == 27){
        // Close my modal window
    }
});
Mithun Sreedharan
źródło
1
najpierw jakieś wykrycie przeglądarki?
ina
7
Uważam, że quirksmode.org zawsze jest wiarygodny, aby dowiedzieć się, co działa w której przeglądarce: quirksmode.org/js/keys.html . Może się okazać, że tylko keyuplub keydownw połączeniu z keyCodedziała we wszystkich przeglądarkach.
Felix Kling
1
Myślę, że tytuł tego pytania powinien brzmieć „Jak wykryć naciśnięcie klawisza Escape za pomocą jquery?” Albo odpowiedzi powinny być w natywnym javascript ...
Wilt
3
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);});Pozdrowienia z 2014 r.
Kalle H. Väravas
Możliwy duplikat tego, który kod dostępu do klawisza Escape z jQuery
Cœur

Odpowiedzi:

957

Uwaga: keyCodejest coraz przestarzałej użycie keyzamiast.

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

Oto jsfiddle


keyCode jest przestarzały

Wydaje się keydowni keyupdziała, chociaż keypressmoże nie


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

Który kod dostępu do klawisza Escape w jQuery

Jigar Joshi
źródło
11
aby odłączyć: $ (dokument) .unbind („keyup”, keyUpFunc);
Plattsy
54
Aby usunąć powiązanie, możesz również użyć przestrzeni nazw na wydarzeniu, $(document).on('keyup.unique_name', ...)oraz$(document).unbind('keyup.unique_name')
Lachlan McD.
9
Zaleca się użycie e. Który (zamiast e. Kod), aby sprawdzić, który klawisz został naciśnięty. jQuery normalizuje kod i kod (używane w starszych przeglądarkach)
DMTintner
1
@DMTintner: na ten sam temat zobacz komentarz pozostawiony przez Jordan Brough stackoverflow.com/a/1160109/759452
Adrien Be
8
Zawsze powinieneś używać ===.
pmandell
211

keydownWydarzenie będzie działać dobrze dla uciec i ma tę zaletę, że pozwala na użycie keyCodewe wszystkich przeglądarkach. Musisz także dołączyć słuchacza do documentciała, a nie do ciała.

Aktualizacja maja 2016 r

keyCodejest obecnie w trakcie wycofywania i większość współczesnych przeglądarek oferuje tę keywłaściwość teraz, choć na razie będziesz potrzebować rezerwy na przyzwoitą obsługę przeglądarek (w chwili pisania bieżących wersji Chrome i Safari nie obsługują jej).

Aktualizacja z września 2018 r. evt.key Jest teraz obsługiwana przez wszystkie nowoczesne przeglądarki.

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
źródło
3
Uwaga: możesz również dodać detektor do <input>elementu, dlatego zostanie on uruchomiony tylko wtedy, gdy ten element jest aktywny.
Mike
1
@Ranmocy: Co to za element (ten z identyfikatorem „test”)? Tylko elementy, które są w stanie odbierać fokus (dane wejściowe formularza, elementy treści, elementy z zestawem tabindex), uruchamiają kluczowe zdarzenia.
Tim Down
1
Możesz także sprawdzić if (evt.key === 'Escape') {zamiast używać przestarzałegokeyCode
Keysox
1
@tobymackenzie: Tak jest. Czy to nie jest cudowne? Witamy w nowym, wspaniałym świecie tworzenia stron internetowych opartym na standardach.
Tim Down
1
Jeśli chcesz wiedzieć, czy możesz bezpiecznie korzystać .key, zobacz caniuse.com/#feat=keyboardevent-key
Jasper de Vries
37

Za pomocą JavaScript możesz zrobić sprawdzenie działającego jsfiddle

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

Za pomocą jQuery możesz sprawdzić działający jsfiddle

jQuery(document).on('keyup',function(evt) {
    if (evt.keyCode == 27) {
       alert('Esc key pressed.');
    }
});
Subodh Ghulaxe
źródło
17

sprawdź, czy keyCode&& which& keyup||keydown

$(document).keydown(function(e){
   var code = e.keyCode || e.which;
   alert(code);
});
jAndy
źródło
Widzę, że to nie działa, jsfiddle.net/GWJVt tylko na ucieczkę ... wydaje się niezręczna?
Reigel
$ (document.body) .keypress () nie odpala
Mithun Sreedharan
@Reigel: rzeczywiście wydaje się, że nie działa poprawnie z naciśnięciem klawisza. W każdym razie nie mogę zrozumieć „niezręcznej” części.
jAndy
3
KeyPress jest podnoszony dla klawiszy znaków (w przeciwieństwie do KeyDown i KeyUp, które są również podnoszone dla klawiszy innych niż znaki), gdy klawisz jest wciśnięty.
Marta
7

Najlepszym sposobem jest stworzenie do tego funkcji

FUNKCJONOWAĆ:

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

PRZYKŁAD:

$("#my-div").escape(function () {
    alert('Escape!');
})
Ivijan Stefan Stipić
źródło
4
W rzeczywistości wydaje się, że keypressnie działa na klawisz Escape. Przynajmniej nie w Chrome na Macu.
samson,
1
Dzięki za opinie, zrobiłem aktualizację i zmianę reguły. keydownnaprawić problem.
Ivijan Stefan Stipić
Zaktualizowałem twoje rozwiązanie, aby móc obsługiwać użycie „tylko raz”. Oto przykład: jsfiddle.net/oxok5x2p .
dh
6

Poniżej znajduje się kod, który nie tylko wyłącza klawisz ESC, ale także sprawdza stan, w którym został naciśnięty, i w zależności od sytuacji wykona akcję lub nie.

W tym przykładzie

e.preventDefault();

wyłączy działanie klawisza ESC.

Możesz zrobić coś takiego, aby ukryć div z tym:

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

W przypadku uwzględnienia również naciśniętego klawisza ESC:

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

Możesz usunąć to, jeśli warunek jest częścią, jeśli chcesz zastosować to do wszystkich. Lub możesz tutaj kierować INPUT, aby zastosować tę akcję tylko wtedy, gdy kursor znajduje się w polu wprowadzania.

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
źródło
0

myślę, że najprostszym sposobem jest javascript waniliowy:

document.onkeyup = function(event) {
   if (event.key === 27){
     //do something here
   }
}
Duan Walker
źródło
6
Na moim chrome (wersja 55.0.2883.95 (64-bit)) dostaję Escapejak event.keyi nie 27
MosheZada,
Powinno być event.keyCode27.
Jens Törnell