Je pensais que ce serait répondu quelque part sur Stack Overflow, mais je ne le trouve pas.
Si j'écoute un événement de pression de touche, dois-je utiliser .keyCode
ou .which
pour déterminer si la touche Entrée a été enfoncée?
J'ai toujours fait quelque chose comme ceci:
$("#someid").keypress(function(e) {
if (e.keyCode === 13) {
e.preventDefault();
// do something
}
});
Mais je vois des exemples qui utilisent .which
au lieu de .keyCode
. Quelle est la différence? Un navigateur est-il plus convivial que l'autre?
javascript
jquery
ScottE
la source
la source
Réponses:
Remarque: La réponse ci-dessous a été écrite en 2010. Ici plusieurs années plus tard, les deux
keyCode
etwhich
sont déconseillés en faveur dekey
(pour la clé logique) etcode
(pour le placement physique de la clé). Mais notez qu'IE ne prend pas en chargecode
et que sa prise en chargekey
est basée sur une ancienne version de la spécification, elle n'est donc pas tout à fait correcte. Au moment où j'écris ceci, l'Edge actuel basé sur EdgeHTML et Chakra ne prend pas en charge noncode
plus, mais Microsoft déploie son remplacement basé sur Blink et V8 pour Edge, ce qui est probablement le cas / le sera.Certains navigateurs utilisent
keyCode
, d'autres utilisentwhich
.Si vous utilisez jQuery, vous pouvez l'utiliser de manière fiable
which
car jQuery normalise les choses ; Plus ici.Si vous n'utilisez pas jQuery, vous pouvez le faire:
Ou bien:
... qui gère la possibilité qui
e.which
pourrait se présenter0
(en restaurant cela0
à la fin, en utilisant l'||
opérateur curieusement puissant de JavaScript ).la source
var key = event.which || event.keyCode;
Cela utiliseraevent.which
s'il est défini et non falsey, ouevent.keyCode
s'ilwhich
est indéfini ou falsey. Techniquement, je devrais probablement le faire,var key = typeof event.which === "undefined" ? event.keyCode : event.which;
mais sievent.which
c'est le cas0
(est-ce possible0
?), Il est peu probable que je prenne soin du genre de choses que je fais.which
, qui je pense n'est fourni que par jQuery mais je ne suis pas sûr à 100%, mais cela devrait vous aider à commencer à voir différences dans les navigateurs)which
est fournikeypress
par tous les navigateurs sauf IE. Et le quirksmode ne fait pas autorité ici. À titre de référence, le lien publié par @TJ Crowder est bien meilleur: unixpapa.com/js/key.html .which
propriété de l'événement peut être nulle, ce qui peut faire une grande différence pour la plupart des applications. Par exemple, les clés non imprimables dans Firefox ont unewhich
propriété de zéro et la mêmekeyCode
propriété quekeydown
. La touche Accueil a unkeyCode
36 sur mon PC dans Firefox, qui est le code de caractère pour "$", ce qui rendrait impossible de faire la distinction entre l'utilisateur appuyant sur la touche Accueil et l'utilisateur tapant un caractère $ en utilisantevent.which || event.keyCode
.jQuery normalisera
event.which
selon queevent.which
,event.keyCode
ouevent.charCode
est pris en charge par le navigateur:Un avantage supplémentaire de
.which
est que jQuery le fait aussi pour les clics de souris:la source
var key = event.which || event.charCode || event.keyCode
event.wich == null && ...
test pour null ou indéfini uniquement. votreevent.wich || ...
test de falsification (indéfini, nul, faux, 0, '', etc.)0
. Et je ne pense pas que vérifier""
ou faire[]
mal.Si vous séjournez dans vanilla Javascript, veuillez noter que keyCode est désormais obsolète et sera supprimé:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
Utilisez plutôt: .key ou .code selon le comportement que vous souhaitez: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code https://developer.mozilla.org/en -US / docs / Web / API / KeyboardEvent / key
Les deux sont implémentés sur des navigateurs modernes.
la source
key
au lieu decode
. Par exemple, si vous avez un clavier avec des touches de contrôle multimédia, appuyez sur Lecture / Pause pour afficher "MediaPlayPause" pourkey
et "" pourcode
.regardez ceci: https://developer.mozilla.org/en-US/docs/Web/API/event.keyCode
Dans un événement de pression de touche, la valeur Unicode de la touche enfoncée est stockée dans la propriété keyCode ou charCode, jamais les deux. Si la touche enfoncée génère un caractère (par exemple «a»), charCode est défini sur le code de ce caractère, en respectant la casse des lettres. (c'est-à-dire que charCode prend en compte si la touche Maj est maintenue enfoncée). Sinon, le code de la touche enfoncée est stocké dans keyCode. keyCode est toujours défini dans les événements keydown et keyup. Dans ces cas, charCode n'est jamais défini. Pour obtenir le code de la clé, qu'elle ait été stockée dans keyCode ou charCode, interrogez la propriété which. Les caractères entrés via un IME ne s'enregistrent pas via keyCode ou charCode.
la source
Je recommanderais
event.key
actuellement. Documents MDN: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyevent.KeyCode
et lesevent.which
deux ont des avertissements désapprouvés désagréables en haut de leurs pages MDN:https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode https://developer.mozilla.org/en-US / docs / Web / API / KeyboardEvent / qui
Pour les clés alphanumériques,
event.key
semble être implémenté de manière identique dans tous les navigateurs. Pour les touches de contrôle (tab, enter, escape, etc.),event.key
a la même valeur dans Chrome / FF / Safari / Opera mais une valeur différente dans IE10 / 11 / Edge (les IE utilisent apparemment une version plus ancienne de la spécification mais se correspondent comme du 14 janvier 2018).Pour les clés alphanumériques, un chèque ressemblerait à quelque chose comme:
Pour les personnages de contrôle, vous devez faire quelque chose comme:
J'ai utilisé l'exemple ici pour tester sur plusieurs navigateurs (j'ai dû ouvrir dans codepen et modifier pour le faire fonctionner avec IE10): https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/ code
event.code
est mentionné dans une réponse différente comme une possibilité, mais IE10 / 11 / Edge ne l'implémente pas, il est donc désactivé si vous souhaitez une prise en charge IE.la source
Une bibliothèque Javascript robuste pour capturer les saisies au clavier et les combinaisons de touches saisies. Il n'a pas de dépendances.
http://jaywcjlove.github.io/hotkeys/
raccourcis clavier comprend les modificateurs suivants:
⇧
,shift
,option
,⌥
,alt
,ctrl
,control
,command
, et⌘
.Les touches spéciales suivantes peuvent être utilisées pour les raccourcis:
backspace
,tab
,clear
,enter
,return
,esc
,escape
,space
,up
,down
,left
,right
,home
,end
,pageup
,pagedown
,del
,delete
et àf1
traversf19
.la source
event.keyCode
.Dans Firefox, la propriété keyCode ne fonctionne pas sur l'événement onkeypress (ne renverra que 0). Pour une solution multi-navigateur, utilisez la propriété which avec keyCode, par exemple:
la source