2013-06-21 50 views
5

我創建了一個函數來返回一個jQuery元素。在jQuery中阻止多個DOM搜索

function GetDialogButton() { 
    return $('a.dialog'); 
}; 

這是因爲在多個其他功能中使用了相同的元素。如果它是從一個地方獲得的,我認爲它是最好的,因此如果屬性名稱改變,將來可以更容易地進行更改。

我想改進此getter,以便在單個頁面加載內多次調用時不會每次執行搜索。

我該怎麼做?我緩存它嗎?或者也許沒有必要,因爲這是優化出來的?

回答

2

您可以創建一個緩存變量,但它會污染全局命名空間再次

var dialogButton; 
function GetDialogButton() { 
    if(dialogButton){ 
     return dialogButton; 
    } 

    dialogButton = $('a.dialog'); 
    return dialogButton; 
}; 
+0

+1好的建議。我想不出任何其他的方式。 –

+0

謝謝,好像我的問題會相當普遍,這是解決它的標準方法嗎? – pingu

1

嗯,你可以lazy-load它。

var $dialogButton = null; 

function GetDialogButton() { 
    if($dialogButton == null) 
     $dialogButton = $('a.dialog'); 
    return $dialogButton 
}; 

另一種選擇,如果你希望在那裏只有一個對話框按鈕,你可以給該元素的ID,然後尋找它的效率會更高

<a id="dialogButton">...</a> 

$('#dialogButton')... // nice and quick 
1

你可以保持的行爲全局命名空間clean by;

function GetDialogButton() { 
    if (typeof GetDialogButton.element === 'undefined') { 
     GetDialogButton.element = $("a.dialog"); 
    } 
    return GetDialogButton.element; 
}; 
+0

如果'GetDialogBu​​tton'(我猜想是全局變量)未定義,該怎麼辦? –

+1

GetDialogBu​​tton是函數本身(一個函數是一個對象,所以可以有屬性)如果它可能是未定義的,你永遠不可能首先調用它。 –

+0

+1不錯的一個。以前從未嘗試過。 –

2

不需要創建全局緩存變量。您可以在不向全局範圍添加變量的情況下執行此操作。這樣的事情會這樣做:

var GetDialogButton = (function() { 
    var set; 

    return function() { 
     if (set === undefined) { 
      set = $('a.dialog'); 
     } 

     return set; 
    }; 
}()); 
+0

但是*是一個緩存變量? – Bergi

+0

@Bergi事實上,這是措辭不佳。 – lonesomeday