2009-05-05 11 views
1

J'ai 2 gestionnaires de clic binded à un élément comme ceci:jQuery gestionnaires de clics multiples ... comment assurer l'ordre de tir?

dans le fichier qui contient le contrôle que je suis se liant à, je le premier gestionnaire, qui fait certaines fonctionnalités spécifiques à ce contrôle

$("#mycontrol").live("click", function() { alert("foo"); }); 

Dans la page principale qui utilise ce contrôle, j'ai un autre gestionnaire de liaison à cet élément pour la page de fonctionnalités spécifiques

$("#mycontrol").live("click", function() { alert("bar"); }); 

J'utilise « en direct » parce que les appels AJAX changent le contrôle tout le temps, de sorte que le h les andlers seront réinscrits. Cependant j'ai besoin d'un moyen pour que "foo" arrive avant "barre" systématiquement ... des suggestions?

+0

Pourquoi la fonctionnalité changent lorsque la Ajax est chargé? Pourquoi ne pas cacher la première entrée et montrer la seconde, avec un identifiant différent? –

+1

Im en utilisant ASP AJAX avec un DataGrid qui a des cases à cocher sur elle. Je veux relier le gestionnaire de clic côté client aux cases à cocher w/jquery lorsque la table est triée ou rafraîchie, par exemple. Le gestionnaire de clic spécifique au contrôle lui-même définit certaines données en fonction de l'état de la case à cocher le gestionnaire de la page fait autre chose avec l'état de case à cocher ... mais le gestionnaire du contrôle doit déclencher en premier car il configure les données nécessaires par le 2ème gestionnaire dans ce cas – puffpio

Répondre

4

Essayez de combiner les événements de clic en un seul:

function foo() { alert("foo"); } 
function bar() { alert("bar"); } 
$("#mycontrol").live("click", function(){ foo.call(this); bar.call(this); }); 
+1

J'ai fini par mettre une fonction JS stub dans le fichier sous-control .. et le gestionnaire de clics appelle cela après c'est propre travail et dans la page principale, je remplace la fonction de bout avec w/la fonctionnalité spécifique de la page – puffpio

5

Comment est sur:

$("#mycontrol").live("click", doFooBar); 

function doFooBar() { 
    alert("foo"); 
    alert("bar"); 
} 
+1

cela ne fonctionnera pas parce que le contrôle et la page principale contiennent tous les deux le gestionnaire en direct .. – puffpio

2

Vous pouvez faire quelque chose comme ce qui suit:

var arrEventHandlers = []; 

function registerClickEvent(fnCallback) 
{ 
    arrEventHandlers.push(fnCallback); 
} 

registerClickEvent (function() { alert ("Foo"); }); 
registerClickEvent (function() { alert ("Bar"); }); 

function clickHandler() 
{ 
    for (var i = 0, size = arrEventHandlers.length; i < size; i++) 
    { 
     arrEventHandlers[i].apply (...); 
    } 
} 

$("#mycontrol").live("click", clickHandler); 
+1

j'aime ça, mais c'est exagéré pour cette instance .. si je dois faire cela plus de temps, je pense que je vais aller avec une solution comme celle-ci – puffpio

Questions connexes