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

559

Mam dwie funkcje. Po naciśnięciu Enter funkcje działają poprawnie, ale po naciśnięciu klawisza Escape nie. Jaka jest poprawna liczba dla klawisza Escape?

$(document).keypress(function(e) { 
    if (e.which == 13) $('.save').click();   // enter (works as expected)
    if (e.which == 27) $('.cancel').click(); // esc   (does not work)
});
Shishant
źródło
Naciśnięcie klawisza zwróci znak podłączony do klawisza (w prawidłowych literach itp.), Klawiatura zwróci liczbę naciśniętych przycisków sprzętowych. Do ESC potrzebujesz kodu sprzętowego 27 (nie ascii 27)
Joeri
Istnieje naprawdę prosta sztuczka, aby dowiedzieć się, który kod chcesz. Po prostu otwórz nową kartę, włóż document.addEventListener("keydown", e => console.log(e.keyCode))do konsoli przeglądarki, kliknij w okno i naciśnij szukany klawisz.
anarchist912,

Odpowiedzi:

925

Spróbuj ze zdarzeniem keyup :

$(document).keyup(function(e) {
  if (e.keyCode === 13) $('.save').click();     // enter
  if (e.keyCode === 27) $('.cancel').click();   // esc
});
CMS
źródło
39
Nie ma to nic wspólnego z kombinacją klawiszy a naciśnięciem klawisza. Aby przechwycić ESCAPE, musisz spojrzeć na e.keyCode, w przeciwieństwie do e.keyCode (co zdarza się w tym przykładzie).
dkaminy
211
„To nie ma nic wspólnego z kombinacją klawiszy a naciśnięciem klawisza” - to nieprawda, dkaminy. Wydaje się, że naciśnięcie klawisza nie jest obsługiwane konsekwentnie między przeglądarkami (wypróbuj wersję demo na api.jquery.com/keypress w IE vs Chrome vs Firefox - czasami się nie rejestruje, a zarówno „który”, jak i „kod klucza” różnią się) podczas gdy keyup jest spójny. e. która jest wartością znormalizowaną dla jquery, więc „który” lub „kod-klucza” powinny działać zarówno w trybie „keyup”.
Jordan Brough
13
@Jordan Brough - Chciałbym poprosić Cię o opublikowanie komentarza jako odpowiedzi, aby inni mogli go przeczytać i zrozumieć rzeczywiste znaczenie Twojego komentarza! ponieważ twój komentarz jest tak samo ważny jak wyjaśnienie odpowiedzi
Murtaza
15
keydownnaśladuje zachowanie natywne - przynajmniej w systemie Windows, w którym naciśnięcie ESC lub Return w oknie dialogowym wyzwoli akcję przed zwolnieniem klawisza.
thomthom
2
@ bełkot Dodałem swój komentarz jako odpowiedź tutaj: stackoverflow.com/a/28502629/58876
Jordan Brough
77

Zamiast na stałe kodować wartości kodu w funkcji, rozważ użycie nazwanych stałych, aby lepiej przekazać swoje znaczenie:

var KEYCODE_ENTER = 13;
var KEYCODE_ESC = 27;

$(document).keyup(function(e) {
  if (e.keyCode == KEYCODE_ENTER) $('.save').click();
  if (e.keyCode == KEYCODE_ESC) $('.cancel').click();
});

Niektóre przeglądarki (takie jak FireFox, niepewne innych) definiują KeyEventobiekt globalny, który udostępnia ci tego rodzaju stałe. To pytanie SO pokazuje fajny sposób zdefiniowania tego obiektu również w innych przeglądarkach.

Seth Petry-Johnson
źródło
15
Co, 27 nie tylko wyskakuje na ciebie jako klucz ucieczki?!? Szczerze mówiąc, tak naprawdę musi to zrobić więcej osób. Nazywam je „magicznymi liczbami” i „magicznymi łańcuchami”. Co znaczy 72? Dlaczego masz bardzo specyficzny i niestabilny ciąg wklejany 300 razy w bazie kodu? itd.
vbullinger,
1
Możesz też dodać komentarz nad każdym z nich, ponieważ prawdopodobnie używasz ich tylko raz. IMO równie czytelne
Ivan Durst
8
@IvanDurst możesz używać ich tylko raz na metodę , ale używam ich wiele razy w moich projektach. Czy naprawdę sugerujesz, że chcesz (1) sprawdzać wartości i (2) komentować je za każdym razem, gdy chcesz użyć kodu klucza? Nie wiem o tobie, ale nie chcę ich zapamiętać ani wierzyć, że inni programiści będą je konsekwentnie komentować. Chodzi o to, aby kodowanie było łatwiejsze i bardziej spójne, a nie tylko bardziej czytelne.
Seth Petry-Johnson
2
Ktoś, kto wie, co mają na myśli, nie musi szukać znaczenia, aby je skomentować, a wpisanie komentarza jest równie szybkie, jak wpisanie długiej nazwy.
NetMage,
6
Co stało się ze starymi, dobrymi czasami, kiedy zwykliśmy kodować stałe znaków w kodzie szesnastkowym? Wszyscy wiedzą, że ESC jest 0x1Bi Enter jest 0x0D, prawda?
David R Tribble,
42

(Odpowiedź pochodzi z mojego poprzedniego komentarza )

Musisz użyć keyupzamiast keypress. na przykład:

$(document).keyup(function(e) {
  if (e.which == 13) $('.save').click();     // enter
  if (e.which == 27) $('.cancel').click();   // esc
});

keypresswydaje się, że nie jest obsługiwany konsekwentnie między przeglądarkami (wypróbuj wersję demo na http://api.jquery.com/keypress w IE vs Chrome vs Firefox. Czasami keypresssię nie rejestruje, a wartości zarówno „które”, jak i „ keyCode 'różnią się), ale keyupjest spójny.

Ponieważ była dyskusja na temat e.whichvs e.keyCode: Uwaga, e.whichjest to wartość znormalizowana dla jquery i jest zalecana do użycia:

Właściwość event.which normalizuje event.keyCode i event.charCode. Zaleca się obejrzenie zdarzenia, które służy do wprowadzania danych z klawiatury.

(z http://api.jquery.com/event.which/ )

Jordan Brough
źródło
5
Chciałbym również dodać tutaj, że przeglądarki, które nie uruchamiają się keypresspodczas ucieczki, robią to dobrze. keypressma strzelać tylko wtedy, gdy klucz produkuje postać, podczas gdy keyupzawsze strzela. developer.mozilla.org/en-US/docs/Web/Events/keypress
ohcibi
26

Aby znaleźć kod dla dowolnego klawisza, użyj tej prostej funkcji:

document.onkeydown = function(evt) {
    console.log(evt.keyCode);
}
Hanzel
źródło
14

27jest kodem klawisza Escape. :)

Słony
źródło
1
Mam dwie funkcje, gdy Enter jest wciśnięty, funkcje działają poprawnie, ale nie z klawiszem Escape. $ (Dokument) .keypress (funkcja (e) {if (e.which == 13) {$ ('. Zapisz'). Kliknij ();} if (e.which == 27) {$ ('. cancel'). click ();}});
Shishant,
$ (dokument) .keypress (funkcja (e) {y = e.keyCode? e.keyCode: e.which;}); Kiedy ostrzegam (y), alarmuje 27 w IE i FF. Czy na pewno nie ma nic złego w kodzie?
Słony
14

Twój najlepszy zakład to

$(document).keyup(function(e) { 
    if (e.which === 13) $('.save').click();   // enter 
    if (e.which === 27) $('.cancel').click(); // esc   

    /* OPTIONAL: Only if you want other elements to ignore event */
    e.preventDefault();
    e.stopPropagation();
});

Podsumowanie

  • whichjest bardziej preferowany niż keyCodedlatego, że jest znormalizowany
  • keyupjest bardziej preferowane niż keydowndlatego, że klawisz skrótu może wystąpić wiele razy, jeśli użytkownik będzie go przytrzymywał.
  • Nie używaj, keypresschyba że chcesz uchwycić rzeczywiste postacie.

Co ciekawe, Bootstrap używa keydown i keyCode w rozwijanym komponencie (od 3.0.2)! Myślę, że jest to prawdopodobnie zły wybór.

Powiązany fragment z dokumentu JQuery

Podczas gdy przeglądarki używają różnych właściwości do przechowywania tych informacji, jQuery normalizuje właściwość .which, dzięki czemu można niezawodnie użyć jej do pobrania kodu klucza. Ten kod odpowiada klawiszowi na klawiaturze, w tym kodom specjalnych klawiszy, takich jak strzałki. Do przechwytywania rzeczywistego wpisu tekstu lepszym wyborem może być .keypress ().

Inne interesujące przedmioty: JavaScript Keypress Library

Shital Shah
źródło
10

Wypróbuj wtyczkę jEscape ( pobierz z dysku Google )

$(document).escape(function() { 
   alert('ESC button pressed'); 
});

lub uzyskaj kod dostępu do przeglądarki

var code = (e.keyCode ? e.keyCode : e.which);
if (code === 27) alert('ESC');
if (code === 13) alert('ENTER');

może możesz użyć przełącznika

var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
    case 27:
       alert('ESC');
       break;
     case 13:
       alert('ENTER');
       break;
}
S. Ferit Arslan
źródło
8

Twój kod działa dobrze. Najprawdopodobniej okno nie jest skoncentrowane. Używam podobnej funkcji do zamykania ramek iframe itp.

$(document).ready(function(){

    // Set focus
    setTimeout('window.focus()',1000);

});

$(document).keypress(function(e) {

    // Enable esc
    if (e.keyCode == 27) {
      parent.document.getElementById('iframediv').style.display='none';
      parent.document.getElementById('iframe').src='/views/view.empty.black.html';
    }

});
Eric Herlitz
źródło
8

Próbowałem zrobić to samo i to mnie wyśmiewało. W Firefoksie wygląda na to, że jeśli spróbujesz wykonać pewne czynności po naciśnięciu klawisza Escape, kontynuuje on przetwarzanie klawisza Escape, który następnie anuluje wszystko, co próbujesz zrobić. Alert działa dobrze. Ale w moim przypadku chciałem wrócić do historii, która nie zadziałała. W końcu zorientowałem się, że muszę zmusić propagację zdarzenia do zatrzymania, jak pokazano poniżej ...

if (keyCode == 27)
{
    history.back();

    if (window.event)
    {
        // IE works fine anyways so this isn't really needed
        e.cancelBubble = true;
        e.returnValue = false;
    }
    else if (e.stopPropagation)
    {
        // In firefox, this is what keeps the escape key from canceling the history.back()
        e.stopPropagation();
        e.preventDefault();
    }

    return (false);
}
Billy Buerger
źródło
8

Wyjaśnić, gdzie nie ma innych odpowiedzi; problemem jest twoje użycie keypress.

Być może zdarzenie jest po prostu źle nazwane, ale keypressjest zdefiniowane jako uruchamiane, kiedy . Tj. Tekst. Natomiast tym, czego chcesz, jest / , który uruchamia się za każdym razem (odpowiednio przed lub po) . Tj. Te rzeczy na klawiaturze.when an actualcharacteris being inserted
keydownkeyupthe user depresses akey

Różnica pojawia się tutaj, ponieważ escjest to znak kontrolny (dosłownie „znak niedrukowalny”), więc nie pisze żadnego tekstu, a więc nawet nie odpala keypress.
enterjest dziwne, ponieważ nawet jeśli używasz go jako znaku kontrolnego (tj. do sterowania interfejsem użytkownika), nadal wstawia znak nowej linii, który zostanie uruchomiony keypress.

Źródło: quirksmode

Hashbrown
źródło
1
Wyrazy uznania za przeczytanie specyfikacji! To na pewno powinna być zaakceptowana odpowiedź :)
DylanYoung
7

Aby uzyskać kod szesnastkowy dla wszystkich znaków: http://asciitable.com/

Julien
źródło
2
Miałem powiedzieć ... Nienawidzę tego, że ta strona znajduje się na górze wyników wyszukiwania, ponieważ jest cholernie brzydka, ale zawiera niezbędne informacje.
mpen
1
Należy pamiętać, że w zależności od zdarzenia i przeglądarki, kody kluczy nie zawsze pasują do tabel ascii.
Alan H.
2
downvote: nie odpowiada na pytanie, nawet nie odpowiada na pytanie, hex nie ma nic wspólnego z pytaniem, a OP już wykazał znajomość esc == 27.
Jeremy
7

Po prostu opublikowałem zaktualizowaną odpowiedź, która nie e.keyCodejest uznawana ZA DEPRECATED na MDN .

Zamiast tego powinieneś wybrać opcję, e.keyktóra obsługuje czyste nazwy dla wszystkiego. Oto odpowiedni kopia makaronu

window.addEventListener("keydown", function (event) {
  if (event.defaultPrevented) {
    return; // Do nothing if the event was already processed
  }

  switch (event.key) {
    case "ArrowDown":
      // Do something for "down arrow" key press.
      break;
    case "ArrowUp":
      // Do something for "up arrow" key press.
      break;
    case "ArrowLeft":
      // Do something for "left arrow" key press.
      break;
    case "ArrowRight":
      // Do something for "right arrow" key press.
      break;
    case "Enter":
      // Do something for "enter" or "return" key press.
      break;
    case "Escape":
      // Do something for "esc" key press.
      break;
    default:
      return; // Quit when this doesn't handle the key event.
  }

  // Cancel the default action to avoid it being handled twice
  event.preventDefault();
}, true);
sierpień
źródło
3
Ale wydaje się, że jest obsługiwany tylko w Firefox i Chrome.
Gayan Weerakutti
Niestety, przynajmniej niektóre wersje Internet Explorera przekazują kod Esczamiast standardowego Escape.
Robin Stewart
6

Solidna biblioteka JavaScript do przechwytywania danych wprowadzanych z klawiatury i kombinacji klawiszy. Nie ma zależności.

http://jaywcjlove.github.io/hotkeys/

hotkeys('enter,esc', function(event,handler){
    switch(handler.key){
        case "enter":$('.save').click();break;
        case "esc":$('.cancel').click();break;
    }
});

Klawisze skrótu rozumie następujących wyrażeń: , shiftoptionaltctrlcontrolcommandi .

Następujące klawisze specjalne mogą być wykorzystywane do skrótów: backspacetab, clear, enter, return, esc, escape, space, up, down, left, right, home, end, pageup, pagedown, del, deletei f1dzięki f19.

小弟 调 调
źródło
5

Zawsze korzystałem z keyup i e. Które złapały klawisz Escape.

Dalius I
źródło