Jaka jest różnica między tymi trzema wydarzeniami? Po googlowaniu stwierdziłem, że:
onKeyDown
Zdarzenie jest wywoływane, gdy użytkownik naciśnie klawisz.onKeyUp
Zdarzenie jest wywoływane, gdy użytkownik zwolni klawisz.onKeyPress
Zdarzenie jest wywoływane, gdy użytkownik naciska i zwalnia klawisz (onKeyDown
następnieonKeyUp
).
Rozumiem pierwsze dwa, ale czy to nie onKeyPress
to samo, co onKeyUp
? Czy można zwolnić klawisz ( onKeyUp
) bez naciskania go ( onKeyDown
)?
To trochę mylące, czy ktoś może mi to wyjaśnić?
javascript
dom
dom-events
instantsetsuna
źródło
źródło
Odpowiedzi:
Sprawdź tutaj zarchiwizowany link pierwotnie użyty w tej odpowiedzi.
Z tego linku:
źródło
KeyPress
,KeyUp
IKeyDown
są analogiczne do odpowiednio:Click
,MouseUp,
iMouseDown
.Down
zdarza się pierwszyPress
dzieje się na drugim miejscu (po wprowadzeniu tekstu)Up
dzieje się na końcu (po zakończeniu wprowadzania tekstu).Wyjątkiem jest webkit , który zawiera dodatkowe zdarzenie:
Poniżej znajduje się fragment, którego możesz użyć, aby zobaczyć, kiedy zdarzenia zostaną uruchomione:
źródło
keypress
ikeydown
zdarzenia dosłownie mają przypisaną tę samą.timeStamp
wartość, co odpowiada dokładności co 5 mikrosekund, ale i tak nie o to mi chodzi. Chodzi mi o to, żeclick
zdarzenie nie jest uruchamiane, dopóki nie zwolnisz przycisku myszy, więc powiedzenie, żekeypress
jest to wersja klawiaturyclick
sprawia, że brzmi, jakbykeypress
nie odpalał, dopóki nie zwolnisz klawisza. W rzeczywistości tak nie jest: uruchamia się, gdy klawisz jest wciśnięty, tak jakkeydown
robi. Tak więckeypress
wcale nie jest analogiczne doclick
.keypress
,keyup
ikeydown
są analogiczne doclick
,mouseup
, imousedown
. Naturalną interpretacją tego jest dla mnie to, żekeypress
odpala w tym samym momencie cokeyup
(tak jakclick
imouseup
). Co nie znaczy, że jeśli nie?Większość odpowiedzi tutaj skupia się bardziej na teorii niż na zagadnieniach praktycznych i istnieją duże różnice między wartościami pól wejściowych
keyup
ikeypress
co do nich, przynajmniej w Firefoksie (przetestowanym w 43).Jeśli użytkownik wpisze
1
pusty element wejściowy:Wartością elementu wejściowego będzie pusty ciąg (stara wartość) wewnątrz modułu
keypress
obsługiWartość elementu wejściowego będzie
1
(nowa wartość) wewnątrz modułukeyup
obsługi.Ma to kluczowe znaczenie, jeśli robisz coś, co opiera się na znajomości nowej wartości po danych wejściowych, a nie bieżącej wartości, np. Walidacja wbudowana lub automatyczne tabulowanie.
Scenariusz:
12345
element wejściowy.12345
.A
.Gdy
keypress
zdarzenie zostanie uruchomione po wprowadzeniu literyA
, pole tekstowe zawiera teraz tylko literęA
.Ale:
12345
.5
Wygląda więc na to, że przeglądarka (Firefox 43) kasuje wybór użytkownika, następnie uruchamia
keypress
zdarzenie, następnie aktualizuje zawartość pól, a następnie odpalakeyup
.źródło
onkeydown
jest zwolniony, gdy klucz jest w dół (jak w skrótach, na przykład wCtrl+A
,Ctrl
odbywa się „w dół”.onkeyup
jest uruchamiany po zwolnieniu klawisza (w tym klawiszy modyfikatora / itp.)onkeypress
jest uruchamiany jako kombinacjaonkeydown
ionkeyup
lub w zależności od powtarzania klawiatury (gdyonkeyup
nie jest uruchamiany). (to powtarzające się zachowanie jest czymś, czego nie przetestowałem. Jeśli wykonasz test, dodaj komentarz!)textInput
(tylko webkit) jest uruchamiany, gdy wprowadzony jest jakiś tekst (na przykładShift+A
wpisuje wielkie litery „A”, aleCtrl+A
zaznacza tekst i nie wprowadza żadnego wprowadzania tekstu. W takim przypadku uruchamiane są wszystkie inne zdarzenia)źródło
Po pierwsze mają inne znaczenie: strzelają:
Po drugie, niektóre klucze uruchamiają niektóre z tych zdarzeń, a inne nie . Na przykład,
Należy również pamiętać, że
event.keyCode
(ievent.which
) zwykle mają tę samą wartość dla KeyDown i KeyUp, ale inną dla KeyPress. Wypróbuj plac zabaw , który stworzyłem. Nawiasem mówiąc, zauważyłem dziwne zachowanie: w Chrome, kiedy naciskam ctrl+, aainput
/textarea
jest puste, KeyPress strzela zevent.keyCode
(ievent.which
) równym1
! (gdy wejście nie jest puste, w ogóle się nie uruchamia).Wreszcie, jest trochę pragmatyki :
textarea
, KeyPress i KeyDown uruchamiają się wiele razy (Chrome 71), użyłbym KeyDown, jeśli potrzebuję zdarzenia, które uruchamia się wiele razy, i KeyUp do wydania pojedynczego klucza.input
sitextarea
si różnych przeglądarkach (głównie z powodu utraty ostrości)Użyłem wszystkich 3 w moim projekcie, ale niestety mogłem zapomnieć o niektórych pragmatykach. (należy zauważyć: są też
input
ichange
wydarzenia)źródło
Ten artykuł Jana Woltera to najlepszy kawałek, z jakim się zetknąłem. Możesz znaleźć zarchiwizowaną kopię tutaj, jeśli link nie działa.
Bardzo dobrze wyjaśnia wszystkie kluczowe zdarzenia przeglądarki,
źródło
Wydaje się, że onkeypress i onkeydown robią to samo (z niewielką różnicą skrótów klawiszowych wspomnianą powyżej).
Możesz spróbować:
Zobaczysz, że zdarzenia onkeypress i onkeydown są wyzwalane podczas naciskania klawisza, a nie po naciśnięciu klawisza.
Różnica polega na tym, że zdarzenie jest wyzwalane nie raz, ale wiele razy (o ile przytrzymasz wciśnięty klawisz). Bądź tego świadomy i postępuj z nimi odpowiednio.
źródło
keypress
wpisują, nie powodują zdarzenia, ale zawsze uruchamiająkeydown
.Zdarzenie onkeypress działa dla wszystkich klawiszy oprócz ALT, CTRL, SHIFT, ESC we wszystkich przeglądarkach, w których zdarzenie onkeydown działa dla wszystkich klawiszy. Oznacza, że zdarzenie onkeydown przechwytuje wszystkie klucze.
źródło
Chciałem tylko podzielić się ciekawością:
kiedy używasz zdarzenia onkeydown do aktywacji metody JS, kod znaków dla tego zdarzenia NIE jest taki sam, jak ten, który otrzymujesz z onkeypress!
Na przykład klawisze numeryczne zwracają te same kody znaków, co klawisze numeryczne nad klawiszami literowymi podczas korzystania z funkcji onkeypress, ale NIE przy korzystaniu z funkcji onkeydown!
Zajęło mi to kilka sekund, aby dowiedzieć się, dlaczego mój skrypt sprawdzający niektóre znaki nie zadziałał podczas używania programu onkeydown!
Demo: https://www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK
i tak. Wiem, że definicje metod są różne .. ale bardzo mylące jest to, że w obu metodach wynik zdarzenia jest pobierany za pomocą event.keyCode .. ale nie zwracają tej samej wartości .. niezbyt wdrożenie deklaratywne.
źródło
0123456789
) sytuacja jest taka samaZasadniczo te zdarzenia działają inaczej w zależności od typu i wersji przeglądarki, stworzyłem mały test jsBin i możesz sprawdzić konsolę, aby dowiedzieć się, jak te zdarzenia zachowują się w docelowym środowisku, mam nadzieję, że ta pomoc. http://jsbin.com/zipivadu/10/edit
źródło
Zaktualizowana odpowiedź:
KeyDown
KeyPress
KeyUp
Jest to zachowanie zarówno
addEventListener
ijQuery
.https://jsbin.com/vebaholamu/1/edit?js,console,output <- spróbuj przykład
(odpowiedź została edytowana z poprawną odpowiedzią, zrzutem ekranu i przykładem)
źródło
Kilka praktycznych faktów, które mogą być przydatne do podjęcia decyzji, które zdarzenie obsłużyć (uruchom skrypt poniżej i skup się na polu wprowadzania):
Groźny:
Klucze nie wstawianie / pisanie (na przykład Shift, Ctrl) nie wywoła
keypress
. Naciśnij Ctrli zwolnij:Klawisze z klawiatury, które mają zastosowanie do innych znaków transformacje postaci może prowadzić do trupów i powielać „Keys” (np ~, ´) w sprawie
keydown
. Naciśnij ´i zwolnij, aby wyświetlić podwójne´´
:Dodatkowo, nietypowe dane wejściowe (np. Dystansowe
<input type="range">
) nadal będą wyzwalać wszystkie zdarzenia związane z wprowadzaniem klucza, naciśnięciem klawisza i naciśnięciem klawisza zgodnie z naciśniętymi klawiszami.źródło