2010-12-01 42 views
0

Je souhaite attacher mon propre gestionnaire d'événement clé à une entrée qui a déjà un autre gestionnaire d'événements attaché à onkeydown. Essentiellement, je veux recevoir un événement clé avant tous les autres gestionnaires et vérifier si l'utilisateur a appuyé sur une certaine touche - si oui, je veux effectuer certaines fonctions et rejeter l'événement, sinon je veux le transmettre à la autre (s) gestionnaire (s).Comment connecter un gestionnaire d'événements clavier à un élément INPUT avec jQuery?

Comment puis-je faire cela avec jQuery?

+0

vous pouvez écrire une déclaration de cas onkeydown et appelez vos propres méthodes avant que les gestionnaires de droite .. – kobe

+0

Oui, mais je veux personnaliser le comportement d'un contrôle tiers sans changer son code source. –

Répondre

3

Si vous chargez un script 3ème partie ou addon jQuery vous pouvez charger simplement votre premier script ou la fonction. Si vous faites cela, alors vous pouvez utiliser quelque chose comme ça sans le désordre de la déliaison et la reliaison des gestionnaires d'événements.

// your possible interceptor code 
$("#awesome").keydown(function(e) { 
    if (e.keyCode < 70) { 
    e.stopImmediatePropagation(); 
    console.log("BLOCKED!!!"); 
    }; 
}); 

// possible 3rd party event code loaded after your code 
$("#awesome").keydown(function(e) { 
    console.log("3rd party:"+e.keyCode); 
}); 

Exemple page =>http://mikegrace.s3.amazonaws.com/forums/stack-overflow/example-key-event-interception.html

Exemple de sortie de la console Firebug alt text

jQuery stopImmediatePropagation() documentation

+2

Est-ce que les gestionnaires liés précédemment n'ont pas déjà été lancés au moment où ils sont appelés? Aussi, je pense que vous vouliez dire e.stopImmediatePropagation() ... e.stopPropagation() empêche l'événement de bouillonner vers les éléments parents, mais je ne pense pas qu'il empêchera les gestionnaires suivants sur le même élément de s'exécuter. –

+1

C, vous aviez raison. Merci d'avoir attrapé ça. Mon exemple a fonctionné parce que j'avais utilisé un gestionnaire de clic dynamique pour représenter le code tiers qui se lie au niveau du document au lieu du niveau de l'élément. J'ai changé ma réponse pour refléter cette nouvelle connaissance. Merci encore d'avoir attrapé ça et de m'apprendre quelque chose de nouveau. –

2

Selon la documentation bind jQuery():.

« Lorsqu'un événement atteint un élément, tous les gestionnaires liés à ce type d'événement pour l'élément sont tirés Si plusieurs gestionnaires enregistrés, ils seront toujours surExécuterdans l'ordre dans lequel ils étaient liés. "

Ainsi, il semble que vous deviez libérer les autres gestionnaires, lier le vôtre, puis ajouter les autres si vous voulez que le vôtre s'exécute en premier.

Il y a quelques bonnes informations dans ce fil par rapport à ce que: jQuery: Unbind event handlers to bind them again later