7
votes

Différencier entre la touche pressée et la clé tenue

J'ai une fonction JavaScript qui fonctionne lorsque vous appuyez sur la touche "DOWN". Je voudrais, que si la touche "DOWN" est maintenue, la fonction ne fonctionnerait pas du tout.

J'ai pensé à la synchronisation entre le clavier et le porte-clés, si le temps est inférieur à 1 seconde, la fonction fonctionnerait sur le porte-clés. Le problème est que si je tiens la clé dans le navigateur le voit comme la clé étant pressée plusieurs fois de suite.

Y a-t-il une meilleure façon de le faire?

merci


2 commentaires

Quel est le contexte? Si vous êtes dans une zone de texte, il serait logique de suivre la valeur de l'entrée avant la dernière touche, puis vérifiez pour voir si plusieurs caractères ont été ajoutés sur l'événement suivant? Je viens de pêcher autour de ...


Pourriez-vous définir un drapeau (par exemple une variable booléenne) lorsque le premier Keydown incendie (mais pas s'il est déjà défini), et non défini sur le bouton Keyup Fires?


7 Réponses :


0
votes

Vous pourriez peut-être déclencher un compteur sur la clé, puis écouter le prochain porte-clés. Dès que le compteur passe plus de cinq secondes, ou si beaucoup de temps que vous jugez, vous pouvez démarrer la fonction. Avoir un sens?


0 commentaires

0
votes

Les clés successifs ne tiennent pas une clé de clé, il est donc possible de différencier entre eux.

http: / /jsfiddle.net/pimvdb/xmfgq/ xxx


0 commentaires

1
votes

Si je comprends votre problème, c'est que votre navigateur interprète une clé détenue comme plusieurs événements de clé. Vous voulez que quelque chose de différent se produise si une clé est détenue par rapport à une pression simplement sur laquelle il est simplement pressé; Et vous voulez que cette différence soit basée sur un peu de temps que vous pensez constituer une "détention" la clé. Vous devez donc vous différencier entre une maintenance et une presse en suivant l'événement Keyup. Le pseudocode suivant résoudra ce problème:

sur clé: xxx

sur porte-clés: xxx

Cela fonctionnera car la minuterie ne redémarrera pas à moins que l'événement KeyUp n'a eu lieu.

MAINTENANT ... Si votre navigateur interprète la clé Holding comme:
Keydown, Keyup, Keydown, Keyup .......
Ensuite, vous avez un problème avec cette approche.


0 commentaires

0
votes

Le navigateur voit la touche enfoncée à plusieurs reprises, mais l'événement ne se produit que sur la première presse.

Ce que vous voulez, c'est la fois à partir de l'événement et non Keauprimé .


0 commentaires

2
votes

Je viens d'écrire ce petit script qui différencie entre une touche enfoncée et une touche ELD en baisse de 200 millisecondes. Peut-être que vous pouvez utiliser: xxx

jsfiddle


0 commentaires

0
votes

J'ai eu un problème similaire. Je voulais capturer tous les «premiers» événements clés, mais ignorer les événements successifs s'ils étaient le résultat d'une clé en détention. Je ne sais pas si c'est ce que vous voulez, mais voici une approche:

var repeat = false;
el.addEventListener("keyup", function() { repeat = false; });
el.addEventListener("keydown", function() {
  if (!repeat) {
    // Run your code.
    repeat = true;
  }
});


0 commentaires

10
votes

Il y a une propriété d'événement de clavier appelé Répéter qui retourne vrai si la clé est en train d'être maintenue.

document.addEventListener('keydown', (event) => {
  if(event.repeat) {
    // key is being held down
  } else {
    // key is being pressed
  }
});


0 commentaires