我正在为数百个相似的页面编写一个Greasemonkey脚本。
并想要在$(“#cont> h2”)中执行AA或AB或AC ... etc等操作
所以我尝试了:
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组。
它可以工作,但是看起来很多余...
我该如何优化呢?
对不起,我的英语不好,谢谢你的答复。
最佳答案
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)来检测文本是否匹配。