Quelle est la différence entre ces trois événements? Lors de la recherche sur Google, j'ai constaté que:
- L'
onKeyDown
événement est déclenché lorsque l'utilisateur appuie sur une touche.- L'
onKeyUp
événement est déclenché lorsque l'utilisateur relâche une clé.- L'
onKeyPress
événement est déclenché lorsque l'utilisateur appuie et relâche une touche (onKeyDown
suivi deonKeyUp
).
Je comprends les deux premiers, mais ce n'est pas onKeyPress
pareil onKeyUp
? Est-il possible de relâcher une touche ( onKeyUp
) sans la presser ( onKeyDown
)?
C'est un peu déroutant, quelqu'un peut-il clarifier cela pour moi?
javascript
dom
dom-events
instantsetsuna
la source
la source
Réponses:
Vérifiez ici le lien archivé utilisé à l'origine dans cette réponse.
De ce lien:
la source
KeyPress
,KeyUp
EtKeyDown
sont analogues à, respectivement:Click
,MouseUp,
etMouseDown
.Down
arrive en premierPress
arrive en second (lorsque le texte est entré)Up
se produit en dernier (lorsque la saisie de texte est terminée).L'exception est le webkit , qui contient un événement supplémentaire:
Vous trouverez ci-dessous un extrait que vous pouvez utiliser pour voir par vous-même lorsque les événements sont déclenchés:
la source
keypress
etkeydown
reçoivent littéralement la même.timeStamp
valeur, qui est précise à des intervalles de 5 microsecondes, mais ce n'est pas vraiment mon point de toute façon. Mon point est que l'click
événement ne se déclenche pas tant que vous ne relâchez pas le bouton de la souris, donc dire quekeypress
c'est la version du clavierclick
qui le fait sonnerkeypress
ne se déclenchera pas jusqu'à ce que vous relâchiez la touche. En fait, ce n'est pas le cas: il se déclenche lorsque la touche est enfoncée, tout comme lekeydown
fait. Cekeypress
n'est donc pas du tout analogueclick
à tout.keypress
,keyup
etkeydown
sont analogues àclick
,mouseup
etmousedown
. L'interprétation naturelle de cela, pour moi, est que cela sekeypress
déclenche au même instant quekeyup
(tout commeclick
etmouseup
). Que vouliez - vous dire, sinon cela?La plupart des réponses ici sont davantage axées sur la théorie que sur les questions pratiques et il existe de grandes différences entre
keyup
etkeypress
en ce qui concerne les valeurs des champs de saisie, au moins dans Firefox (testé en 43).Si l'utilisateur tape
1
dans un élément d'entrée vide:La valeur de l'élément d'entrée sera une chaîne vide (ancienne valeur) à l'intérieur du
keypress
gestionnaireLa valeur de l'élément d'entrée sera
1
(nouvelle valeur) à l'intérieur dukeyup
gestionnaire.Ceci est d'une importance critique si vous faites quelque chose qui repose sur la connaissance de la nouvelle valeur après l'entrée plutôt que sur la valeur actuelle, comme la validation en ligne ou la tabulation automatique.
Scénario:
12345
dans un élément d'entrée.12345
.A
.Lorsque l'
keypress
événement se déclenche après avoir saisi la lettreA
, la zone de texte contient désormais uniquement la lettreA
.Mais:
12345
.5
Il semble donc que le navigateur (Firefox 43) efface la sélection de l'utilisateur, puis déclenche l'
keypress
événement, puis met à jour le contenu des champs, puis se déclenchekeyup
.la source
onkeydown
est déclenché lorsque la touche est enfoncée (comme dans les raccourcis; par exemple, dansCtrl+A
,Ctrl
est maintenu enfoncé).onkeyup
est tiré lorsque la touche est relâchée (y compris les touches de modification / etc)onkeypress
est déclenché comme une combinaison deonkeydown
etonkeyup
, ou en fonction de la répétition du clavier (lorsqu'ilonkeyup
n'est pas déclenché). (ce comportement répété est quelque chose que je n'ai pas testé. Si vous testez, ajoutez un commentaire!)textInput
(webkit uniquement) est déclenché lorsque du texte est entré (par exemple,Shift+A
entrerait en majuscule «A», maisCtrl+A
sélectionnerait du texte et ne saisirait aucune entrée de texte. Dans ce cas, tous les autres événements sont déclenchés)la source
Tout d'abord, ils ont une signification différente: ils tirent:
Deuxièmement, certaines touches déclenchent certains de ces événements et n'en déclenchent pas d'autres . Par exemple,
En outre, vous devez garder à l'esprit que
event.keyCode
(etevent.which
) ont généralement la même valeur pour KeyDown et KeyUp mais différente pour KeyPress. Essayez le terrain de jeu que j'ai créé. Soit dit en passant, j'ai remarqué une bizarrerie: dans Chrome, lorsque j'appuie sur ctrl+ aet que leinput
/textarea
est vide, pour KeyPress se déclenche avecevent.keyCode
(etevent.which
) égal à1
! (lorsque l'entrée n'est pas vide, elle ne se déclenche pas du tout).Enfin, il y a quelques pragmatiques :
textarea
, KeyPress et KeyDown se déclenchent plusieurs fois (Chrome 71), j'utiliserais KeyDown si j'ai besoin de l'événement qui se déclenche plusieurs fois et KeyUp pour la libération d'une seule clé.input
s ettextarea
s dans différents navigateurs (principalement en raison d'une perte de concentration)J'ai utilisé les 3 dans mon projet, mais j'ai peut-être malheureusement oublié certains aspects pragmatiques. (à noter: il y a aussi
input
etchange
événements)la source
Cet article de Jan Wolter est la meilleure pièce que j'ai rencontrée, vous pouvez trouver la copie archivée ici si le lien est mort.
Il explique très bien tous les événements clés du navigateur,
la source
Il semble que onkeypress et onkeydown fassent de même (avec la petite différence de touches de raccourci déjà mentionnée ci-dessus).
Vous pouvez essayer ceci:
Et vous verrez que les événements onkeypress et onkeydown sont tous deux déclenchés lorsque la touche est enfoncée et non lorsque la touche est enfoncée.
La différence est que l'événement est déclenché non pas une fois mais plusieurs fois (tant que vous maintenez la touche enfoncée). Soyez conscient de cela et gérez-les en conséquence.
la source
keypress
événement, mais déclenchent toujours unkeydown
.L'événement onkeypress fonctionne pour toutes les clés sauf ALT, CTRL, SHIFT, ESC dans tous les navigateurs où l'événement onkeydown fonctionne pour toutes les clés. Signifie que l'événement onkeydown capture toutes les clés.
la source
Je voulais juste partager une curiosité:
lorsque vous utilisez l'événement onkeydown pour activer une méthode JS, le code de caractère de cet événement n'est PAS le même que celui que vous obtenez avec onkeypress!
Par exemple, les touches du pavé numérique renverront les mêmes codes de caractères que les touches numériques au-dessus des touches alphabétiques lors de l'utilisation de onkeypress, mais PAS lors de l'utilisation de onkeydown!
Cela m'a pris quelques secondes pour comprendre pourquoi mon script qui vérifiait certains charcodes a échoué lors de l'utilisation de onkeydown!
Démo: https://www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK
et oui. Je sais que la définition des méthodes est différente .. mais ce qui est très déroutant, c'est que dans les deux méthodes, le résultat de l'événement est récupéré en utilisant event.keyCode .. mais ils ne renvoient pas la même valeur .. pas très mise en œuvre déclarative.
la source
0123456789
)Fondamentalement, ces événements agissent différemment selon le type et la version du navigateur, j'ai créé un petit test jsBin et vous pouvez vérifier la console pour savoir comment ces événements se comportent pour votre environnement cible, espérons cette aide. http://jsbin.com/zipivadu/10/edit
la source
Réponse mise à jour:
Touche Bas
Appuyez sur la touche
KeyUp
C'est le comportement des deux
addEventListener
etjQuery
.https://jsbin.com/vebaholamu/1/edit?js,console,output <- exemple d'essai
(la réponse a été modifiée avec la bonne réponse, capture d'écran et exemple)
la source
Quelques faits pratiques qui pourraient être utiles pour décider de l'événement à gérer (exécutez le script ci-dessous et concentrez-vous sur la zone de saisie):
Pressage:
les touches non insérées / tapées (par exemple Shift, Ctrl) ne déclencheront pas a
keypress
. Appuyez Ctrlet relâchez:les clés des claviers qui appliquent des transformations de caractères à d'autres caractères peuvent entraîner la mort et la duplication de "clés" (par exemple ~, ´)
keydown
. Appuyez ´et relâchez-le pour afficher un double´´
:De plus, les entrées ne tapant pas (par exemple, à distance
<input type="range">
) déclencheront toujours tous les événements de touches, de touches et de touches en fonction des touches enfoncées.la source