2010-03-30 45 views
0

給定以下代碼爲什麼我得到ab不同的值?我原以爲他們會返回相同的東西:緩存的JQuery選擇器行爲,我不明白

(function() { 
    var a = $('#foo'); 

    var Test = function(){ 
    console.log(a); //outputs 'jQuery()' 
    var b = $('#foo'); 
    console.log(b); //outputs 'jQuery(select#foo)' which is what I want 
    }; 
})(); 

這個問題源於我試圖將頻繁使用的選擇器插入瓦爾。最初我是用每種方法做的(就像我在上面的例子中用var b做的那樣),但是後來我發現我需要在多種方法中使用選擇器,所以我把任務移到了可用的地方(或者我認爲)在那個匿名函數中的方法。正如你所看到的,它不起作用。爲什麼是這樣?

編輯:此代碼是通過點擊觸發的方法加載的。 id foo在頁面加載時不會動態設置或更改。

+3

當'Test'叫什麼名字? – 2010-03-30 17:09:21

+0

在我的實際代碼中,它是一個函數,當提交表單時,它將作爲數據驗證方法的一部分被調用。無論如何頁面加載後。 – Stuart 2010-03-30 17:29:42

+0

但現在我想到了,匿名函數本身可能不會在恰當的時間加載。它由一個插件加載,但必須在頁面完成之前加載(因此'#foo'不可用)。然後,'Test()'在頁面加載後通過點擊被調用,所以自然會起作用。這有助於,謝謝! – Stuart 2010-03-30 19:07:34

回答

1

確保在頁面加載完成後才能調用代碼!

$(function() { 
    // your code 
}); 

而且,當然,你要小心,可能在頁面上由您的客戶端應用程序的其他部分來改變緩存的東西。

+0

它在頁面加載後調用。正在使用的ID在html中設置...它不會以任何方式更改或動態顯示。 – Stuart 2010-03-30 17:31:20

1

只是爲了改進上一個答案 - 只有在調用Test函數時纔會對b進行評估,可能一旦加載頁面。緩存文檔中的選擇器準備好:

$(document).ready(function(){ 
    var a = $('#foo'); 
}); 

我只在一段代碼中使用相同的選擇器時緩存選擇器。我使用這個變量$命名約定:

var $divs = $('div'); 

您也可以鏈功能整合在一起,以避免緩存選擇:

$('div').append('hello world').addclass('hello').show(); 
+0

我會說這是最有可能的罪魁禍首。將代碼放入$(document).ready()事件中可以確保在代碼運行時訪問DOM,並且jQuery對象將找到一個元素。 – Bob 2010-03-30 17:37:25