2012-06-14 11 views
36

pokrewne: JavaScript KeyCode vs CharCodekeypress i keyup - dlaczego kod klucza jest inny?

Oto kod można spróbować w domu albo w jsfiddle:

el.addEventListener('keyup', function(e) { 
    console.log('Keyup event'); 
    console.log(e.keyCode); 
}); 
el.addEventListener('keypress', function(e) { 
    console.log('Keypress event'); 
    console.log(e.keyCode); 
}); 

Dlaczego keyCode inaczej?

Rozumiem, dlaczego należy używać tylko naciśnięcia klawisza, ale nie rozumiem, jak dwa kluczowe zdarzenia, przy tym samym naciśnięciu klawisza na klawiaturze, dają różne kody kluczy.

PS: Nie martwię się obsługą starszych przeglądarek, próbowałem tego w Chrome i byłem zaskoczony i nie mogłem znaleźć wytłumaczenia.

+0

Pytanie [onKeyPress Vs. onKeyUp i onKeyDown] (http://stackoverflow.com/questions/3396754/onkeypress-vs-onkeyup-and-onkeydown) jest w pewnym stopniu powiązany i może również być interesującą lekturą. –

Odpowiedz

42

Zdarzenia mają zupełnie inne cele. Użyj keyup i keydown do identyfikacji kluczy fizycznych i keypress do identyfikacji wpisanych znaków. Oba są zasadniczo różnymi zadaniami z różnymi zdarzeniami; nie próbuj mieszać dwóch. W szczególności, zdarzenia keyCode na keypress są zwykle zbędne i nie powinny być używane (z wyjątkiem starszych IE, ale patrz dołączony dokument poniżej, aby dowiedzieć się więcej); w przypadku naciśnięć klawiszy, które można wydrukować, zwykle jest taki sam, jak which i charCode, chociaż istnieją pewne różnice między przeglądarkami.

Jan Wolter's article on key events, już połączone w innej odpowiedzi, jest ostateczne słowo na ten temat dla mnie i ma tablice opisujące to, co każdy z różnych właściwościach powraca do każdego rodzaju imprezy oraz klucza każdej przeglądarki.

+5

Rozumiem, że cele są różne, nie oznacza to, że kod klucza jest inny, mimo że * klucze * są takie same. –

+0

@FlorianMargaine: Na stronie Jana Woltera znajdują się tabele pokazujące, co każda nieruchomość zwraca dla każdego wydarzenia.W przypadku WebKita (a nawet w większości przeglądarek), 'keyCode' zwraca to samo, co' which' i 'charCode' dla zdarzeń' keypress', które są kodami znakowymi odpowiadającymi wprowadzonemu znakowi, w przeciwieństwie do kodu klawisza klucza wciśnięty (jak to jest w 'keyup' i' keydown'). –

+1

Musiałem uważnie przeczytać artykuł dotyczący tej części: 'W zdarzeniach typu keydown i keyup, kody klawiszy nie są kodami znaków, a ta konwersja daje dzikie wyniki dla wielu kluczy. Nie ma generalnego przenośnego sposobu konwertowania kodów klawiszy na znaki. Musisz dokładnie wyczuć typ przeglądarki i oprzeć na niej kluczowe mapowanie. Nie mam informacji na temat kodów przesyłanych przez międzynarodowe klawisze. :) Dziękuję za odpowiedź btw! –

2

Istnieje odpowiedź good article on quirksmode.org na to pytanie. Możesz również spojrzeć na Unixpapa's results.

+0

Tryb quirksmode szczególnie mówi: "na przykład małe litery" a "i wielkie litery" A "mają ten sam kod klucza", dlatego nie rozumiem. Czy jest coś, co przeoczyłem? Drugi artykuł jest powiązany w powiązane pytanie :) –

+1

Są to te same klawisze na klawiaturze, tylko z różnymi modyfikatorami (shift). Keyup/down to naciśnięcia klawiszy, naciśnięcie klawisza dla wpisanego tekstu. – Bergi

+0

Powinny więc podać ten sam kod klucza. Dlaczego nie zależą od wydarzenia? –

0

Cóż, natknąłem się na jedną różnicę, gdy próbowałem skopiować wpis użytkownika z jednego wejścia formularza do innej części formularza, którą miałem zablokowaną dla mnie, aby użytkownicy mogli ją edytować. Stwierdziłem, że za każdym razem, gdy użytkownik przejdzie do następnej etykiety za pomocą klawisza po wprowadzeniu danych wejściowych, jeden wpis ostatniej klawiatury został pominięty w skopiowanym wpisie, gdy użyłem klawisza eventListener do naciśnięcia klawisza i zostało to rozwiązane przy użyciu klawisza keyup.

Więc podsumowując przy naciśnięciu słucha stanu w chwili, kiedy klawisz został naciśnięty, pomijając wynik naciśnięciem klawisza, natomiast keyup słucha stanu systemu po naciśnięciu przycisku i obejmuje wynik naciśnięcie.