2012-10-21 3 views
0

Je voudrais déclencher un événement, une fois après la touche vers le bas et un événement différent seulement après la flèche vers le bas a été libéré, comme ceci:jQuery attendre keyup après keydown

$('body').keydown(function (e) 
{ 
    if(e.keyCode==40) 
    { 
     //do something 
    } 
    $('body').keyup(function (d) 
    { 
     if(d.keyCode==40) 
     { 
      //do something else 
     } 
    } 
} 

Ce code ne fonctionne que partiellement . Le clavier est déclenché en continu lorsque la touche fléchée vers le bas est maintenue enfoncée.

J'ai un setInterval dont je modifie la fréquence de rafraîchissement lorsque je maintiens la touche fléchée. Malheureusement, setTimeOut n'est pas une option dans cette situation.

Alors mon code ressemble à ceci:

 clearInterval(interval); 
     refresh = 100; 
     interval(); 
+0

Partiellement? Alors, quelle est la partie qui ne fonctionne pas pour vous? –

+3

Vous liez actuellement un nouveau gestionnaire d'événements à l'événement onkeyup à chaque fois qu'un événement keydown se produit. Aussi, pouvez-vous s'il vous plaît être un peu plus précis sur votre problème? – Niko

+0

De quoi exactement avez-vous besoin - il y a déjà deux événements différents (un pour 'keydown', un pour' keyup')? – Bergi

Répondre

1
$('body').keydown(function (e) { 
    if(e.keyCode==40) { 
     //do something 
    } 
    return false; 
}) 
.keyup(function(e) { 
    if(e.keyCode==40) { 
     //do something else 
    } 
    return false; 
}); 


$('body').on('keyup', function (e) { 
    if(e.keyCode==40) { 
     //do something 
    } 
    // after first keyup set to handle next keydown only once: 
    $(this).one('keydown', function(e) { 
     if(e.keyCode==40) { 
      //do something else 
     } 
    }); 
}); 

Si vous avez besoin exactement déclencheur l'événement et ne gèrent pas comme il est dans votre exemple, vous devez utiliser la méthode $.trigger().

+0

Désolé, j'aurais dû être plus clair. Je ne veux effectuer le keydown qu'une seule fois jusqu'à ce que keyup. – Harangue

+0

S'il vous plaît vérifier ma modification. –

+0

Cela ne fonctionne pas tant que l'événement de manipulation n'a pas eu lieu une seule fois. Encore, +1. – Harangue

0
$('body').keydown(function (e) 
{ 
    console.log('down'); 
}​).keyup(function(e){console.log('up')});​​​​ 
1

Si vous voulez faire une action qu'une seule fois alors que la touche reste enfoncée, il suffit de garder une trace de ce que:

var arrowKeyDown = false; 

$('body').keydown(function(e) { 
    if (e.which == 40 && !arrowKeyDown) { 
     arrowKeyDown = true; 
     // ... 
    } 
}); 

$('body').keyup(function(e) { 
    if (e.which == 40) { 
     arrowKeyDown = false; 
    } 
}); 

Démo: http://jsfiddle.net/utfwQ/

+0

+1 pour l'exemple. :) – Harangue

0

Si vous avez vraiment besoin d'enlever le keyup écouteur lorsque vous avez terminé, http://jsfiddle.net/CgmCT/

document.body.addEventListener('keydown', function (e) { 
    if(e.keyCode === 40){ 
     console.log('key 40 down'); 
     // key down code 
     document.body.addEventListener('keyup', function listener(d){ 
      if(d.keyCode === 40){ 
       document.body.removeEventListener('keyup', listener, true); 
       console.log('key 40 up'); 
       // key up code 
      } 
     }, true); 
    } 
}, true);​ 
Questions connexes