我創建了一個函數來返回一個jQuery元素。在jQuery中阻止多個DOM搜索
function GetDialogButton() {
return $('a.dialog');
};
這是因爲在多個其他功能中使用了相同的元素。如果它是從一個地方獲得的,我認爲它是最好的,因此如果屬性名稱改變,將來可以更容易地進行更改。
我想改進此getter,以便在單個頁面加載內多次調用時不會每次執行搜索。
我該怎麼做?我緩存它嗎?或者也許沒有必要,因爲這是優化出來的?
我創建了一個函數來返回一個jQuery元素。在jQuery中阻止多個DOM搜索
function GetDialogButton() {
return $('a.dialog');
};
這是因爲在多個其他功能中使用了相同的元素。如果它是從一個地方獲得的,我認爲它是最好的,因此如果屬性名稱改變,將來可以更容易地進行更改。
我想改進此getter,以便在單個頁面加載內多次調用時不會每次執行搜索。
我該怎麼做?我緩存它嗎?或者也許沒有必要,因爲這是優化出來的?
您可以創建一個緩存變量,但它會污染全局命名空間再次
var dialogButton;
function GetDialogButton() {
if(dialogButton){
return dialogButton;
}
dialogButton = $('a.dialog');
return dialogButton;
};
嗯,你可以lazy-load它。
var $dialogButton = null;
function GetDialogButton() {
if($dialogButton == null)
$dialogButton = $('a.dialog');
return $dialogButton
};
另一種選擇,如果你希望在那裏只有一個對話框按鈕,你可以給該元素的ID,然後尋找它的效率會更高
<a id="dialogButton">...</a>
$('#dialogButton')... // nice and quick
你可以保持的行爲全局命名空間clean by;
function GetDialogButton() {
if (typeof GetDialogButton.element === 'undefined') {
GetDialogButton.element = $("a.dialog");
}
return GetDialogButton.element;
};
如果'GetDialogButton'(我猜想是全局變量)未定義,該怎麼辦? –
GetDialogButton是函數本身(一個函數是一個對象,所以可以有屬性)如果它可能是未定義的,你永遠不可能首先調用它。 –
+1不錯的一個。以前從未嘗試過。 –
不需要創建全局緩存變量。您可以在不向全局範圍添加變量的情況下執行此操作。這樣的事情會這樣做:
var GetDialogButton = (function() {
var set;
return function() {
if (set === undefined) {
set = $('a.dialog');
}
return set;
};
}());
但是*是一個緩存變量? – Bergi
@Bergi事實上,這是措辭不佳。 – lonesomeday
+1好的建議。我想不出任何其他的方式。 –
謝謝,好像我的問題會相當普遍,這是解決它的標準方法嗎? – pingu