2012-02-03 70 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,然後你會得到詞彙範圍。)