2010-03-08 5 views
3

Je crée une interface Web pour contrôler un petit robot. Les appels Ajax seront effectués sur un clavier, pour démarrer le robot, et le clavier pour l'arrêter. Mon problème est le suivant: lorsqu'une touche est maintenue enfoncée, les événements KeyCap, KeyBack et Keypress semblent continuellement fonctionner. Est-ce que quelqu'un sait d'un moyen d'avoir seulement le feu de clé lorsque la clé est pressée et le clavier enfoncé quand il a été libéré? --edit: J'ai oublié de le mentionner à l'origine mais j'ai essayé d'enregistrer l'état du bouton. Le problème est que les événements de keydown, de keypress et de keyup tirent encore et encore pendant que je maintiens la clef vers le bas.Comment éviter plusieurs événements de montée/descente/de pression de touche lorsque vous maintenez une touche enfoncée?

+0

Quel (s) navigateur (s) utilisez-vous lorsque vous obtenez ce comportement? –

+0

Je l'ai essayé à la fois dans Chrome et Firefox – Rammay

Répondre

0

Vous pouvez essayer d'enregistrer l'état de la clé. Lorsque la clé descend, vérifiez si la touche est déjà enfoncée, sinon, démarrez le robot et marquez la touche comme elle a été pressée. Si c'est déjà pressé, ne faites rien. Sur la touche, faire la même chose pour arrêter le robot et marquer la touche comme non pressée.

0

Lorsque vous démarrez votre robot, supprimez le gestionnaire d'événements de l'événement keypress et ajoutez un gestionnaire d'événements pour l'événement de touche pour arrêter le robot. Lorsque votre événement de touche se déclenche, arrêtez le robot et ajoutez-le à nouveau.

EDIT: En supprimant le gestionnaire d'événements de votre événement keydown. Vous voudrez utiliser les événements keydown et keyup ... pas la touche.

Donc, en gros:

  1. assigner gestionnaire d'événements keydown
  2. assign gestionnaire d'événements keyup
  3. sur keydown, retirez le gestionnaire d'événements keydown et commencer votre robot
  4. sur keyup, réattribuer la keydown gestionnaire d'événements
+0

Comme vous pouvez le voir à partir de l'édition, le problème est en fait que les événements cycle tout le temps continuellement. Très peu de temps après le déclenchement du clavier, le clavier se déclenche même si la touche physique est maintenue enfoncée. – Rammay

+0

Utilisez-vous une sorte de bibliothèque (dojo, jQuery, etc) pour gérer ces événements? Pourriez-vous partager votre code? – smencer

2

Je ne peux pas reproduire le problème- Je ne trouve aucun bouton événements lancés à partir du clavier, , peu importe combien de temps je tiens une touche.

Cette méthode est à l'écoute d'un keydown, exécute du code, et attend un clic avant d'écouter un autre keydown.

L'alerte est appelée uniquement sur un fichier.

var A=[], who=// I used a textarea, substititute your own target 
who.onkeydown= who.onkeyup= function(e){ 
e=window.event || e; 
var t= e.type, target= e.target || e.srcElement; 
A.push(t); 
if(t== 'keydown'){ 
    // start robot and stop listening to keydown 
    target.onkeydown= ''; 
} 
else if(t== 'keyup'){ 
    // stop robot and listen for keydown 
    target.onkeydown= arguments.callee; 
    alert(A) 
} 
} 
Questions connexes