在创建有序的元素列表时,我可以考虑通过索引访问一个元素的三种合理方法:
给它一个唯一的id,最后带一个数字并使用字符串操作:
<ol>
<li id="item-0"></li>
<li id="item-1"></li>
<li id="item-2"></li>
</ol>
...
for(var i = 0; i < 3; i++) {
$('#item-' + i).doWhatever();
}
为他们提供相同的课程并使用eq
选择器:
<ol>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
</ol>
...
for(var i = 0; i < 3; i++) {
$('.item').eq(i).doWhatever();
}
或者给他们相同的班级并使用nth-child
选择器:
<ol>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
</ol>
...
for(var i = 1; i <= 3; i++) {
$('.item:nth-child(' + i + ')').doWhatever();
}
每种优缺点有哪些?还有其他更好的方法吗?
答案 0 :(得分:4)
我想到了一些不同之处:
答案 1 :(得分:1)
我在您的性能测试中添加了第四个测试用例:http://jsperf.com/item1-vs-item-eq-1/2
按顺序考虑你的要点:
getElementById
和childNodes
我认为要考虑的主要问题是,当您在列表中进行迭代时,所有方法都涉及重复查询DOM。如果你只访问一个单独的元素,这不是什么大问题,但是如果你要在整个列表中工作,那么只做一个查询就会在性能方面产生很大的不同。
编辑出于好奇,我updated my case again根本不使用jQuery来查找列表,而只是使用我上面提到的准系统DOM API。
即使Sandor在指出我的愚蠢错误后做出的改变,也会产生明显的性能影响。考虑到这一点,我会说它主要归结为您的特定用例以及您如何权衡速度与多功能性以查找列表项。