Existe-t-il un moyen de détecter si une clé est actuellement en panne dans JavaScript?
Je connais l'événement "keydown", mais ce n'est pas ce dont j'ai besoin. Quelques temps APRÈS avoir appuyé sur la touche, je veux être en mesure de détecter si elle est toujours enfoncée.
PS Le plus gros problème semble être qu'après un certain temps, la clé commence à se répéter, déclenchant des événements keydown et keyup comme un démon. J'espère qu'il n'y a qu'une simple fonction isKeyDown (key), mais sinon, ce problème devra être surmonté / contourné.
javascript
input
keyboard
Daniel X Moore
la source
la source
Réponses:
Nan. La seule possibilité surveille chaque
keyup
etkeydown
et se souvenir.Ça ne devrait pas. Vous serez certainement
keypress
répété, et dans de nombreux navigateurs, vous serez également répétékeydown
, mais s'il sekeyup
répète, c'est un bogue.Malheureusement, ce n'est pas un bogue complètement inconnu: sous Linux, Chromium et Firefox (lorsqu'il est exécuté sous GTK +, ce qui est dans les distributions populaires telles que Ubuntu), les deux génèrent des séquences de touches répétées pour les touches maintenues, qui sont impossibles à distinguer de quelqu'un qui martèle la clé très rapidement.
la source
keyup
événements correspondants .En plus d'utiliser
keyup
et deskeydown
écouteurs pour suivre quand une touche descend et recule, il existe en fait certaines propriétés qui vous indiquent si certaines touches sont enfoncées.Ce sont disponibles sur tous les objets d'événements générés par navigateur, tels que ceux de
keydown
,keyup
etkeypress
, donc vous ne devez pas utiliser mousemove.J'ai essayé de générer mes propres objets événementiels avec
document.createEvent('KeyboardEvent')
etdocument.createEvent('KeyboardEvent')
et de cherchere.shiftKey
et autres, mais je n'ai pas eu de chance.J'utilise Chrome 17 sur Mac
la source
Ma solution:
Je peux maintenant vérifier si une touche est enfoncée ailleurs dans le script en vérifiant
Si c'est vrai, la touche est enfoncée.
la source
Je ne pense pas qu'il existe une fonction isKeyDown, mais vous pouvez écrire la vôtre.
Fondamentalement, créez un tableau dont la longueur correspond au nombre de clés que vous souhaitez surveiller. Ensuite, en utilisant les événements keyUp et keyDown documents / pages / controls, mettez à jour le tableau avec l'état de cette clé.
Ensuite, écrivez une fonction qui vérifie si une certaine touche est enfoncée et renvoie un booléen.
Cela devrait accomplir ce que vous voulez.
la source
Terminé ici pour vérifier s'il y avait déjà quelque chose de intégré au navigateur, mais il semble que ce ne soit pas le cas. Voici ma solution (très similaire à la réponse de Robert):
Vous pouvez alors vérifier si une touche est enfoncée avec
is_key_down('ArrowLeft')
.la source
D'autres personnes ont déjà posé ce genre de question (bien que je ne vois aucune dupe évidente ici pour le moment).
Je pense que la réponse est que l'
keydown
événement (et son jumeaukeyup
) sont toutes les informations que vous obtenez. La répétition est assez fermement connectée au système d'exploitation et un programme d'application n'a pas beaucoup l'occasion d'interroger le BIOS pour connaître l'état réel de la clé.Ce que vous pouvez faire, et peut-être devoir le faire si vous avez besoin de faire fonctionner cela, est de dé-rebondir la clé par programme. Essentiellement, vous pouvez évaluer
keydown
etkeyup
vous - même mais ignorer unkeyup
événement s'il se produit trop rapidement après le dernierkeydown
... ou essentiellement, vous devriez retarder votre réponsekeyup
suffisamment longtemps pour être sûr qu'il n'y a pas un autrekeydown
événement suivant avec quelque chose comme 0,25 seconde dekeyup
.Cela impliquerait d'utiliser une activité de minuterie et d'enregistrer les millisecondes des événements précédents. Je ne peux pas dire que c'est une solution très attrayante, mais ...
la source
la source
Le code suivant est ce que j'utilise:
Lorsque l'utilisateur maintient la touche Alt enfoncée pendant un certain temps (environ 2 secondes), un groupe d'étiquettes (class = 'key hidden') apparaît. Lorsque la touche Alt est relâchée, les étiquettes disparaissent. jQuery et Bootstrap sont tous deux utilisés.
la source
Je sais que c'est une question très ancienne, mais il existe une bibliothèque JavaScript très légère (~ 0,5 Ko) qui "corrige" efficacement le déclenchement incohérent des gestionnaires d'événements de clavier lors de l'utilisation de l'API DOM.
La bibliothèque est Keydrown .
Voici l'exemple de code opérationnel qui a bien fonctionné pour mes besoins en modifiant simplement la clé sur laquelle définir l'écouteur:
J'ai incorporé Keydrown dans mon JavaScript côté client pour une animation de pause appropriée dans un jeu Red Light Green Light que j'écris. Vous pouvez voir l'intégralité du jeu ici . (Remarque: si vous lisez ceci à l'avenir, le jeu devrait être complet et jouable :-D!)
J'espère que ça aide.
la source
J'ai scanné les réponses ci-dessus et l' approche proposée
keydown
/keyup
ne fonctionne que dans des circonstances spéciales. Si l'utilisateur s'éloigne ou utilise un geste de touche pour ouvrir une nouvelle fenêtre ou un nouvel onglet de navigateur, alors unkeydown
sera enregistré, ce qui est bien, car à ce stade, il est impossible de dire si la clé est quelque chose que l'application Web surveille , ou est un navigateur standard ou un raccourci du système d'exploitation. En revenant à la page du navigateur, il pensera toujours que la clé est maintenue, bien qu'elle ait été publiée entre-temps. Ou une touche est simplement maintenue enfoncée, pendant que l'utilisateur passe à un autre onglet ou application avec la souris, puis relâchée en dehors de notre page.Les touches de modification (
Shift
etc.) peuvent être surveillées viamousemove
etc. en supposant qu'au moins une interaction de la souris est attendue lors de la tabulation, ce qui est souvent le cas.Pour la plupart toutes les autres touches ( à l' exception des modificateurs,
Tab
,Delete
mais y comprisSpace
,Enter
), le suivikeypress
travaillerait pour la plupart des applications - une clé maintenue enfoncée continuera à feu. Il y a cependant une certaine latence dans la réinitialisation de la clé, en raison de la périodicité dukeypress
déclenchement. Fondamentalement, si lekeypress
tir ne continue pas, il est possible d'exclure la plupart des clés. Ceci, combiné avec les modificateurs, est assez hermétique, même si je n'ai pas exploré quoi faire avecTab
etBackspace
.Je suis sûr qu'il existe une bibliothèque qui résume cette faiblesse du DOM, ou peut-être qu'une modification de la norme DOM l'a corrigée, car c'est une question plutôt ancienne.
la source
Regardez cette réponse et utilisez
onkeyup
etonkeydown
. Voici des informations plus spécifiques sur ces événements.la source
Cela fonctionne dans Firefox et Chrome.
J'avais besoin d'ouvrir un fichier html spécial localement (en appuyant sur
Enter
lorsque le fichier est sélectionné dans l'explorateur de fichiers de Windows), soit juste pour afficher le fichier, soit pour le modifier dans un éditeur en ligne spécial.J'ai donc voulu faire la distinction entre ces deux options en maintenant la
Ctrl
touche enfoncée ou non, tout en appuyant surEnter
.Comme vous l'avez tous compris de toutes les réponses ici, cela ne semble pas vraiment possible, mais voici une manière qui imite ce comportement d'une manière qui était acceptable pour moi.
La façon dont cela fonctionne est comme ceci:
Si vous maintenez la
Ctrl
touche enfoncée lors de l'ouverture du fichier, un événement keydown ne se déclenchera jamais dans le code javascript. Mais un événement keyup se déclenchera (lorsque vous relâcherez enfin laCtrl
touche -key). Le code capture cela.Le code désactive également les événements clés (à la fois keyup et keydown) dès que l'un d'eux se produit. Donc, si vous appuyez sur la
Ctrl
touche après l'ouverture du fichier, rien ne se passera.la source
si vous appuyez sur alt + entrée, vous verrez l'alerte.
la source