2012-02-03 5 views
2

J'ai une situation comme celle-ci:Accédez à une variable globale

talenti = $(".talenti"); 
filtra = $(".filtra"); 
wrapNavHeight = $("#wrapNav").outerHeight(true); 
filtra.click(function(e) { 
    e.preventDefault(); 
    $(".nasco").hide(); 
    $("#sliding-navigation").delay(delay).show(); 
    delay += 500; 
    talenti.removeClass('opened'); 
    filtra.addClass('opened'); 
    filtra.attr('id',"focF"); 
    talenti.attr('id',""); 
    if (filtra.hasClass("opened")) { 
     $("#wrapNav").slideToggle("100", "linear", function(){ 
      alert(wrapNavHeight); 
      $("#container").animate({"height": "+=wrapNavHeight"}, 100,function(){ 
       $(".box").animate({"top": "+=wrapNavHeight"}); 
      }); 
     }); 
    } 
}); 

Je tente d'obtenir wrapNavHeight mais alerte (wrapNavHeight); sorties nulles; ne peut pas ensuite affecter cette valeur aux lignes animées suivantes

Quelqu'un?

+0

chèque ' $ ("# wrapNav"). outerHeight (true); ', que retourne-t-il? est-ce que 'wrapNav' id est bon? – davioooh

+0

#wrapNav est en effet un identifiant.Au tout début si je vérifie sa valeur avec une alerte, elle renverra la valeur null car elle est affichée: none; mais j'utilise ensuite slideToggle et il l'agrandit et le révèle de sorte que sa hauteur soit alors définie quand je demande sa valeur dans l'alerte selon le code ci-dessus mais pour certaines raisons il retourne toujours nul –

+0

Je seconde ce que David C. a suggéré - très probablement 'outerHeight()' renvoie 'null' - ce qui pourrait signifier que vous l'appelez sur un ensemble vide d'éléments - ie' # wrapNav' pointe sur (http://api.jquery.com/outerHeight/). Mais cela peut aussi dépendre de la version de jQuery que vous utilisez - il y avait quelques bugs liés, comme [this] (http://bugs.jquery.com/ticket/7693) –

Répondre

2

est pas juste que vous assignez la variable au moment où la valeur de outerHeight ce n'est pas visible? Je pense que vous devez ré-évaluer outerHeight après la transition toggle. Remplacer

alert(wrapNavHeight); 

avec

alert($("#wrapNav").outerHeight(true)); 

voir si c'est mieux?

+0

Vous avez parfaitement raison et pas seulement sens mais il renvoie la valeur correcte. N'importe quelle idée pourquoi la var globale assignée en haut, wrapNavHeight, elle n'est pas lue par l'animation? Au point d'animation $ ("# wrapNav"). OuterHeight (true) (qui est défini comme wrapNavHeight en haut) est une valeur que l'alerte indique lorsque vous utilisez votre suggestion –

+0

pas tout à fait sûr de ce que vous essayez de faire ici, mais Si vous essayez d'ajouter wrapNavHeight à la hauteur #container, alors quelque chose comme ça peut le faire: –

+0

var newHeight = $ ("# container"). height() + $ ("# wrapNav"). outerHeight (true); –

0

Personne d'autre n'a vraiment expliqué pourquoi cela se produisait. Voici pourquoi:

Cela dépend:

  • quel objet est utilisé comme « ce » pour l'invocation de la fonction contenant tout le code ci-dessus
  • quel objet est utilisé comme « ce » pour l'invocation du fonction définie à partir de la ligne 4 de votre code

en JavaScript, les références « globales » qu'appliquent actuellement l'objet this courant (ou à l'objet global « true » (window dans les navigateurs web) sinon dans une fonction Par conséquent, si les objets this pour les 2 fonctions que j'ai indiquées ci-dessus sont différents, alors vous obtiendrez la situation que vous avez observée.

Dans le navigateur, la valeur par défaut objet this est généralement window, mais cela peut être changé lorsque la fonction est exécutée, par exemple en passant un autre paramètre à apply ou en appelant la fonction comme méthode.

J'étais un an depuis que j'ai utilisé jQuery sérieusement, mais si je me souviens bien, les gestionnaires d'événements jQuery relient généralement this à quelque chose d'utile lié à l'événement (en utilisant apply-- vous pouvez aussi le faire).

Donc, en supposant que la fonction de this extérieure n'a pas été lié à autre chose que spécial window, il suffit de remplacer wrapNavHeight avec window.wrapNavHeight dans la fonction intérieure pour atteindre l'effet désiré.

(Dans la pratique, je ne le ferais pas fait cela, cependant, comme une question de style. Il suffit de déclarer wrapNavHeight comme var dans la fonction externe à la place, et vous aurez une portée lexicale.)