2009-12-15 2 views
3

J'ai deux événements que je veux observer sur un objet,La combinaison de deux gestionnaires d'événements, jQuery

input.blur(function(event) { 
    ajaxSubmit(this); 
    event.preventDefault(); 
}); 

form.submit(function(event) { 
    ajaxSubmit(this); 
    event.preventDefault(); 
}); 

Mais je me sens comme cela ne suffit pas à sec, je peux lier deux événements à mon objet input et exécuter ma fonction ajaxSubmit() si le feu?


Quel serait super cool est si vous pouvez faire:

input.bind("blur", "submit", function(event) { 
    ajaxSubmit(this); 
    event.preventDefault(); 
}); 
+1

Vous parlez d'un "objet", mais votre exemple fait référence à deux objets ('input' et' form'). –

+0

yah ... Je n'ai pas vraiment de sens là-bas hein. mais que se passeraient-ils s'ils étaient le même objet? et les événements ont eu un sens, comme "hover" et "flou" ou quelque chose? existe-t-il un moyen plus simple de lier plusieurs événements? –

Répondre

10

Vous pouvez utiliser la méthode on

$("#yourinput").on("blur submit", functionname); 

peut combiner un certain nombre d'événements; séparez-les avec un espace.

+0

Bien sûr, cela ne fonctionnerait pas car les champs d'entrée n'ont pas d'événements 'submit', mais le concept est correct pour lier plusieurs événements. –

+0

Il peut câbler tous les événements à l'intérieur de la fonction de liaison. – rahul

+2

@adamantium, désolé je n'étais pas clair. Le code ne déclencherait pas d'erreur, mais l'événement 'submit' ne serait pas appelé sur le formulaire' form' submit, car il semble que ce soit l'intention du PO. –

4

Oui, juste déclarer la fonction, puis associez aux événements:

var ajaxCallback = function(event){ 
    ajaxSubmit(this); 
    event.preventDefault(); 
}; 

input.blur(ajaxCallback); 
form.submit(ajaxCallback); 

Remarque sur les variables déclaration:

Comme le souligne @cletus, la façon dont je décla La fonction fournit une variable qui est privée quelle que soit la portée dans laquelle elle est définie. Je programme toujours de cette façon pour minimiser la pollution de l'espace de noms global. Toutefois, si vous êtes pas définissant à la fois ce rappel et il se liant aux éléments dans le même bloc de code, vous devez définir cette façon:

function ajaxCallback(event){ ... } 

De cette façon, il est disponible partout où vous le liez plus tard il en utilisant les méthodes .blur et .submit.

+0

Il vaut mieux définir la fonction: function ajaxCallback() {...}. Votre chemin pourrait avoir la variable indéfinie lorsque vous essayez de l'utiliser alors qu'une définition de fonction directe n'a pas ce problème. – cletus

+0

@cletus Je l'ai écrit de cette façon intentionnellement, mais vous avez un bon point que la différence ne soit pas immédiatement évidente pour ceux qui lisent ma réponse. Je l'ai mis à jour pour fournir quelques explications sur les options de déclaration de la fonction. Merci! –

+0

@Doug Neiner: Vous avez lié le gestionnaire * après * l'expression de la fonction, donc votre code est correct. Les deux expressions définissent la fonction dans toute la portée du code. –