2009-08-06 6 views
1

J'appelle la première fonction ci-dessous pour lier la seconde fonction à l'événement onClick. La chose étrange est que l'appel de la première fonction entraîne le déclenchement de la deuxième fonction.Evénement jQuery Bind qui déclenche l'événement

Le paramètre LinkName de la première fonction est le nom d'un élément table td - probablement sans importance.

function EnableExpand(LinkName, i) { 
    $(LinkName).addClass("link-text"); 
    $(LinkName).bind("onclick", ExpandFrame(LinkName, i)); 
} 

function ExpandFrame(lName, i) { 
    $("#mapFrame" + i).attr({ height: 500, width: 800 }); 
} 

Répondre

4

Le problème est que le second argument de .bind() doit être une fonction, mais vous appelez une fonction. JQuery évalue l'appel de la fonction et essaie de lier le résultat à l'événement click. En enveloppant l'appel de fonction dans une fonction anonyme, comme suggéré, le moteur javascript liera la fonction wrapper à l'événement et n'évaluera pas ce qu'il contient.

$(LinkName).click(function() { ExpandFrame(LinkName, i) }); 

Il peut être utile de réaliser que l'utilisation de ce qui suit est équivalente à votre code ci-dessus.

$(LinkName).click(function() { ExpandFrame(LinkName, i) }()); 
+0

merci, j'ai aimé ces fonctions anonymes ... – GilShalit

+0

+1 Great explanation! –

4

Vous devez transmettre une fonction qui sera appelée lorsque l'événement click se produit. De la façon dont vous l'aviez, vous appeliez la fonction immédiatement et demandiez à JQuery d'appeler la valeur renvoyée par cette fonction.

$(LinkName).bind("click", function() { ExpandFrame(LinkName, i); }); 
+0

Correct, mais ce serait bien d'expliquer pourquoi. ;) – Joel

+0

ouais, pourquoi? Peu importe, ça a marché, merci! – GilShalit

2

Vous n'avez pas besoin de la liaison. .click fera l'affaire.

$(LinkName).click(function() { ExpandFrame(LinkName, i) });