ID 绝对是最快的。部分原因是 ID 应该是唯一的,所以 API 在 DOM 中找到 ID 后停止搜索。
如果必须使用类或属性选择器,可以通过指定可选的上下文参数来提高性能。
例如...
$(".someclass", "#somecontainer")
somecontainer 类似于一个 div,围绕着一个类为 someclass 的元素。在somecontainer 只包含一小部分 DOM 的情况下,这可以提供巨大的性能优势。
更新:
几年前我围绕上下文参数做了一些测试。在阅读了下面的 cmets 之后,我很好奇是否有任何变化。事实上,现在的浏览器似乎已经改变了一些情况。也许它也与 jQuery 的改进有关?我不知道。
这是我的 10,000 次迭代的结果(代码如下):
IE9
$(".someclass") - 2793 毫秒
$(".someclass", "#somecontainer") - 1481 毫秒
Chrome 12
$(".someclass") - 75 毫秒
$(".someclass", "#somecontainer") - 104 毫秒
Firefox 3.6
$(".someclass") - 308 毫秒
$(".someclass", "#somecontainer") - 357 毫秒
所以在这三大现代浏览器中,context 参数似乎只对 IE9 有帮助。较旧的浏览器也将从上下文参数中受益。但考虑到这些浏览器中的每一个的普及率并平均所有内容,现在的净收益有点被洗掉了。
这是代码,以防有人想自己尝试......
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
startTime = new Date().getTime();
for (i = 0; i < 10000; i++)
{
s = $(".someclass");
}
$("#withoutcontext").html(elapsedMilliseconds(startTime));
startTime = new Date().getTime();
for (i = 0; i < 10000; i++)
{
s = $(".someclass", "#somecontainer");
}
$("#withcontext").html(elapsedMilliseconds(startTime));
});
function elapsedMilliseconds(startTime)
{
var n = new Date();
var s = n.getTime();
var diff = s - startTime;
return diff;
}
</script>
</head>
<body>
<h1>jQuery Selector Performance: Context vs No Context</h1>
<h2>$(".someclass")</h2>
<span id="withoutcontext">---</span> ms<br /><br />
<h2>$(".someclass", "#somecontainer")</h2>
<span id="withcontext">---</span> ms<br /><br />
<hr />
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
<div id="somecontainer">
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
<p class="someclass">someclass</p>
</div>
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
<p class="a">a</p>
<p class="b">b</p>
<p class="c">c</p>
</body>
</html>