2012-07-05 136 views
0

我正在爲數百個類似頁面寫一個Greasemonkey腳本。jQuery包含多個字符串優化

,並想在$ AA或AB或AC ...等( 「#續> H2」)

所以,我試圖做一些事情:

var 1stgroup = new Array(40) 
1stgroup [0] = $("#cont > h2:contains('AA')") 
1stgroup [1] = $("#cont > h2:contains('AB')") 
1stgroup [2] = $("#cont > h2:contains('AC')") 
... 
1stgroup [39] = $("#cont > h2:contains('BN')") 

for (i =0; i < 40 ; i++) { 
    if (1stgroup.text())  { 
    //do something here 
    }; 
}; 

而且比組2〜7 。

它的工作,但看起來多餘...

我該如何優化它?

對不起我英文不好,謝謝你的回覆。

+0

組數有限制嗎?可能是'ZZ'還是'GDQ'?另外,'#cont> h2'中的文本的例子是什麼? – hookedonwinter 2012-07-05 13:18:48

+0

我會先緩存選擇器。 ''''而不是'new Array()',並確保你沒有任何像'i'這樣的全局變量,只是'var i = 0' ... – elclanrs 2012-07-05 13:20:27

+0

AA到ZZ只代表一些名字,我使用這些保護個人隱私,在'#cont> h2'有'Names'' – orocannoneer 2012-07-05 13:22:49

回答

4
  • DOM遍歷是JavaScript中最慢的部分,所以儘可能少地遍歷DOM是有意義的。
  • :contains()是一個Sizzle擴展,不是CSS3的一部分,所以沒有被瀏覽器優化。它會很慢。

考慮到這一點,我會做這樣的事情;

var matches = ['AA', 'AB', 'AC']; 

$('#cont > h2').filter(function() { 
    var text = $(this).text(); 

    for (var i=0;i<matches.length;i++) { 
     if (text.indexOf(matches[i]) !== -1) { 
      return true; 
     } 
    } 

    return false; 
}).each(function() { 
    // do something with each of these 
}); 

另一件事你可以是這樣排序matches陣列,然後使用的搜索算法(例如binary search),其是比線性搜索聰明來檢測文本是否是匹配或沒有。

+0

完美的作品5頁,我會爲所有其他頁面和報告工作,非常感謝 – orocannoneer 2012-07-05 13:40:11

+0

適用於2組,但我發現了一個新的問題:例如,有兩個人,一個叫Harry Porter,他在第一組。他的名字是Harry Porter Jr,他在group2中。 Harry Porter Jr的頁面設置爲group2,但Harry Porter的頁面同時設置了group1設置和group2設置,我該如何處理? – orocannoneer 2012-07-05 15:20:07