2012-02-03 86 views
2

我有这样一个情况:访问一个全局变量

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"}); 
      }); 
     }); 
    } 
}); 

我试图让wrapNavHeight但警报(wrapNavHeight);输出为空;不能然后将该值分配给下一个生成线

任何人?

+0

检查' $(“#wrapNav”)。outerHeight(true);',它返回什么? 'wrapNav'的编号是正确的? – davioooh 2012-02-03 08:42:14

+0

#wrapNav确实是一个ID。在一开始,如果我用警报检查它的值,它将返回null,因为它是display:none;但我然后使用slideToggle,它确实展开它并显示它,所以当我按照上面的代码询问它的值时,它的高度就会被定义,但由于某些原因,它仍然会返回null – 2012-02-03 08:44:37

+0

我大卫C所建议的 - 最有可能'outerHeight()'返回'null' - 这可能意味着你在一组空元素上调用它 - 也就是''wrapNav'指向注释(http://api.jquery.com/outerHeight/)。但它也可能取决于你正在使用的jQuery版本 - 有一些相关的错误,如[这一个](http://bugs.jquery.com/ticket/7693) – 2012-02-03 08:51:56

回答

2

是不是只是你在它的不可见的时间分配可变的outerHeight的价值?我认为您需要在切换转换后重新评估outerHeight。更换

alert(wrapNavHeight); 

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

看看是否是更好吗?

+0

你是完全正确的,而不仅仅是使但它确实会返回正确的值。任何想法为什么全局变量我分配在顶部,wrapNavHeight,它不读取的动画?在动画点$(“#wrapNav”)。outerHeight(true)(它被定义为wrapNavHeight在顶部)是一个值,当alerton使用您的建议 – 2012-02-03 08:56:45

+0

时说不完全确定您要在这里做什么,但如果你想将wrapNavHeight添加到#容器高度,那么像这样的东西可能会这样做: – 2012-02-03 09:05:04

+0

var newHeight = $(“#container”)。height()+ $(“#wrapNav”)。outerHeight(true); – 2012-02-03 09:06:16

0

没有人真正解释了为什么会发生这种情况。这里的原因:

这取决于:

  • 该对象被用作“这”上面
  • 包含所有代码的函数调用该对象被用作“本”为调用函数中定义开始在你的代码的4行

在JavaScript中,“全球性”的引用实际上也适用于当前this对象(或“真正的”全局对象(window在Web浏览器),如果没有一个函数内)

因此,如果上面指出的2个函数的this对象是不同的,那么你会得到你观察到的情况。

在浏览器中,默认this对象通常为window,但通过使不同的参数来apply或通过调用函数作为方法运行该功能时,这可以改变的,如。

自从我认真使用jQuery以来,一年过去了,但如果我记得正确的话,jQuery事件处理程序通常会将this重新绑定到与事件有关的事情上(使用apply--您也可以这样做)。

因此,假设外部函数的this尚未绑定到什么特别的东西比其他window,只是在内部功能来实现你想要的效果与window.wrapNavHeight取代wrapNavHeight

(在实践中,我不会真正做到这一点,但是,作为一个风格问题,只是声明wrapNavHeight作为外部函数,而不是内部的var,然后你会得到词汇范围。)