2011-03-03 74 views
1

我一直在使用下面的測試/功能對在努力只重視功能,以適當的頁面元素,如果一個或多個存在:在jQuery綁定函數之前檢查元素的最佳方法是什麼?

function assistedSearch() { 
    $('.assistedSearch').focus(function() { 
     ... 
    }); 
} 
$(function() { 
    if ($('.assistedSearch').length > 0) { 
     assistedSearch(); 
    } 
}); 

function inputHinting() { 
    $(':input.hint').each(function() { 
     ... 
    }); 
} 
$(function() { 
    if ($(':input.hint').length > 0) { 
     inputHinting(); 
    } 
}); 

這是對工程的經典案例?每個函數綁定之前的「if」測試是否不必要?

如果它不是過度工程,那麼確保只有必需的功能綁定到當前頁面的DOM密集方式是否較少?

+2

它沒有意義,因爲jQuery默認處理所有這些,所有你正在做的事情都會再次重演:) – Val 2011-03-03 11:56:11

回答

3

通過這樣做,你提出你實際上是失去方法性能,因爲每個查詢dom和你的函數再次發出查詢。

function inputHinting() { 
    $(':input.hint').each(function() { //query the dom again since it was found. 
     ... 
    }); 
} 
$(function() { 
    if ($(':input.hint').length > 0) { //Query the dom for :input.hint 
     inputHinting(); 
    } 
}); 

,因爲它可以確保元素存在之前的東西是做給它jQuery將您處理該問題。有了這樣說,如果你這樣做,你應該緩存你選擇這樣的:

function inputHinting($inputHint) { 
    $inputHint.each(function() { 
     ... 
    }); 
} 
$(function() { 
    var $inputHint = $(':input.hint'); 
    if ($inputHint.length > 0) { //Query the dom for :input.hint 
     inputHinting($inputHint); 
    } 
}); 

通過這樣做,你只能查詢DOM一次。

+0

上面的「傳遞」示例中有趣的方法。我是否正確地認爲,如果最終得到一個零匹配變量(例如,如果$ inputHint的長度爲0),它將在封裝它的「就緒」語句結束時自動從內存中移除?我正在考慮影響性能的內存限制,特別是在移動設備上。 – markedup 2011-03-03 13:07:33

+0

根據這個答案http://stackoverflow.com/questions/3396264/jquery-garbage-collection-will-this-be-clean只要你用jQuery對象進行操作,它應該跟蹤變量並處理它們必要時。 – 2011-03-03 13:32:09

0

你不應該真的在意這一點。 Jquery在內部檢查,所以你不必擔心它。如果你真的必須檢查它是否屬於你自己的原因,.length財產將是要走的路。

編輯

而且,你不需要做

if ($(':input.hint').length > 0){} 

只需用下面的等價

if ($(':input.hint').length) {} 
0

試試這個:

(function(elem) 
{ 
    if(elem.length>0) 
     elem.each(function() 
     { 
      ... 
     }); 
})($(':input.hint')); 

因此,這將查詢DOM只有一次,那麼它會jQuery對象集合傳遞給匿名函數並執行它。

+0

這似乎並沒有爲我做任何事;沒有迭代,沒有錯誤 - 沒有。我喜歡這個主意。 – markedup 2011-03-03 14:27:37

相關問題