2010-10-10 6 views
56

Próbuję zaimplementować funkcję naciśnięcia klawisza, która usunie element div, gdy użytkownik trafi na Esc. Działa to dla Firefoksa & IE z następującego kodu:"keypress" jQuery nie działa dla niektórych kluczy w Chrome. Jak obejść?

$("body").keypress(function(e) { 
    alert("any key pressed"); 
    if (e.keyCode == 27) { 
     alert("escape pressed"); 
    } 
}); 

Gdybym uderzyć dowolny klawisz, pojawi się pierwszy alert, a jeśli uderzę Ucieczka, wyświetlany jest także drugi alert.

To nie działa z Chrome. Pierwszy alert jest zawsze wyświetlany, gdy uderzę w któryś z klawiszy literowych, ale nie po naciśnięciu Escape, Tab, Space ani żadnej z liczb.

Dlaczego miałoby to być? Czy istnieje sposób, aby Chrome zareagował na te naciśnięcia klawiszy?

+0

To jest [znany błąd] (https://bugs.chromium.org/p/chromium/issues/detail?id=9061) Chrome. W maju 2016 r. Programista stwierdził, że ich zachowanie pasuje do specyfikacji i [nie naprawi tego] (https://bugs.chromium.org/p/chromium/issues/detail?id=9061#c15). – Sheepy

Odpowiedz

108

Zamiast tego spróbuj wykonać operację keydown.

+4

zaoszczędziłeś mi dużo czasu ...dzięki SLaks – bragboy

+17

Podstępem do tej odpowiedzi, która moim zdaniem jest bardzo ważna do zapamiętania, jest to, że "próba obsługi' keydown' "nie jest rozwiązaniem uniwersalnym, ale specyficznym dla" niektórych kluczy ". Nadal potrzebujesz 'keypress', aby poprawnie obsługiwać znaki ASCII. Tak naprawdę jest to (pomieszany) wieloetapowy proces. – Kato

+0

Świetna odpowiedź. Miałem dokładnie ten sam problem i zajął się tym. –

16

użyć keydown. keypress nie działa z ESC w Chrome (nie mam pewności co do innych przeglądarek).

$(newTag).keydown(function(e) { //keypress did not work with ESC; 
    if (event.which == '13') { 
     ProfilePage.saveNewTag(search_id, $(newTag).val()); 
    } 
    else if (window.event.which){ 
     $(newTag).remove(); 
    } 
}); 
+1

Dziękujemy za zgłoszenie błędu przeglądarki Chrome. Przyda się to tym, którzy zastanawiają się, dlaczego naciśnięcie klawisza faktycznie działa dla nich w innych przeglądarkach. – Gustus

1

Po drugim alert dodać również

e.preventDefault(); 

uniemożliwi to domyślna akcja zdarzenia być wyzwalany.

Więcej informacji na temat tej metody here

Twój kod powinien wyglądać

$("body").keypress(function(e) { 
    alert("any key pressed"); 
    if (e.keyCode == 27) { 
     alert("escape pressed"); 
     e.preventDefault(); 
}}); 
2

Dla klawisza ESC:

$(document).keydown(function(e) { 
    if(e.keyCode == 27) { /* Run code */ } 
} 

na klucze list, jak 'L':

$(document).keypress(function(e) { 
    if(e.which == 108) { } 
}); 

działa zarówno w Chrome i Firefox

0

Korzystanie plik Jquery.hotkey js można zrobić Sortcut kluczowego

$(document).bind('keydown', 'esc', function(){ }); 
+0

Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – DimaSan

0

keypress 'ESC'

e.which: 0 
e.keyCode: 27 

keyup 'ESC'

e.which: 27 
e.keyCode: 27 

Dla znaków niedrukowalnych lepiej używać keyup.

Powiązane problemy