2012-07-05 89 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