举个例子,如果我有一个无序列表,比如说:
<ul>
<li class="foo">Foo</li>
<li class="bar">Bar</li>
</ul>
我可以选择将foo作为
$('ul li.foo')
, $('li.foo')
或 $('。foo')
。
那么哪种方式更有效(如果有的话),为什么呢?或者是指定父级选择子元素只是为了消除任何冲突,以防其他元素具有相同的类名!.foo
在现代浏览器中速度最快,因为它可以利用本地可用的getElementsByClassName
。
以下是一个显示这一点的基准测试:
您可以在所有重要的浏览器中运行该性能测试,并根据结果做出决定。或者只需使用对您的情况最有效的选择器,在实际世界中,它不会产生任何明显的差异。
更新
现在我们可以看到更广泛的浏览器性能结果,你可以看到旧版与新版之间的差别(IE7和8中缺少 getElementsByClassName
)。但是,如今您很可能会从新的浏览器中获得更多的流量,但我不知道您的网站,因此如先前所述,您只需要选择适合您的内容。如果由于某种原因您90%的流量来自IE7,则应该使用li.foo
。.foo
是现代浏览器中最快的选择器。其他选择器将选择 .foo
,然后过滤掉不是 li
的任何内容,然后(对于 $('ul li.doo')
)沿树向上迭代并确保某处有一个 ul
。
然而,在没有 getElementsByClassName 和 querySelectorAll 的旧浏览器中(如IE6),.foo
将不会是最快的。
如果您知道页面上只有一个 foo
,最快的方法是使用 ID 并执行 $('#foo')
。
getElementsByClassName
,因此本地查找的好处将会丢失;但是如果这些浏览器有getElementsByTagName
,那么首先按标签选择,然后再按类别缩小范围可能比选择所有元素然后缩小范围更快(未经测试)。例如:请参见性能测试页面中的 IE7和IE8结果。 - Phrogz