有幾個問題需要緩存jQuery對象,但我找不到一個問題,究竟jQuery對象能夠並應該緩存在哪裏。我有一個網頁,其中包含一個JavaScript文件,其中包含一系列功能,如下所示。我應該在什麼級別緩存jQuery DOM查詢的結果?
$(document).ready(function() {
// do some setup
});
/* function queries the DOM with the same selector multiple times without caching */
function myFunctionOne() {
$('#name_input').css("border","1px solid #ccc");
$('#name_input').val(someValue);
}
/* function uses cached object from a single query */
function myFunctionTwo() {
var nameInput = $('#name_input')
nameInput.css("border","1px solid #ccc");
nameInput.val(someValue);
// do some other stuff with cached selector
}
在myFunctionOne
我低效查詢DOM的兩倍,而在myFunctionTwo
我查詢DOM一次,緩存結果在一個局部變量,然後用該變量的工作。我知道myFunctionTwo
中的方法更高效,但我不確定應該在哪裏實際緩存這些對象。在那一刻,我在方法級緩存對象,但我想知道我是否實際上可以將它緩存在更高級別,然後在多個函數中使用它。這樣我只會查詢一次DOM,然後在該文件中的所有函數中重新使用結果。下面顯示了我所建議的一個例子。
$(document).ready(function() {
// do some setup
var nameInput = $('#name_input')
});
/* function uses cached query result from .ready function above */
function myFunctionOne() {
nameInput .css("border","1px solid #ccc");
nameInput .val(someValue);
}
/* function uses cached query result from .ready function above */
function myFunctionTwo() {
nameInput.val(someValue);
// do some other stuff with cached selector
}
這種方法是合理的還是有更好的方法呢?也許使用.ready函數是一個糟糕的地方做這種設置,因爲它會減慢頁面加載速度?有沒有其他的方法來緩存jQuery對象在對象級別或應該只緩存在功能級別?
我同意你的觀點,即不要過早優化它的重要性,在我的情況下,這是不成熟的。我在IE8中看到了性能問題,爲了糾正這個問題,我們正在尋找一些jQuery推薦的最佳實踐,其中之一就是緩存選擇器。我打算儘可能使用本地緩存並在兩種方法之間進行緩存。你說過,「方法之間的緩存代碼複雜性比本地緩存代價更大」。請你詳細說明一下,因爲這可能有助於回答我原來的問題嗎? – user2088756 2013-02-19 23:12:46