Jquery元素+类选择器性能

Lan*_*nka 26 performance jquery jquery-selectors

我在选择元素时希望$('#childDiv2 .txtClass')$('#childDiv2 input.txtClass')表现得更好<input type="text" id="txtID" class="txtClass"/>.但根据这种表现,分析 $('.txtClass');是其中最好的选择.我正在使用JQuery 1.7.2有没有人对此有解释?

类选择器的性能分析

HTML

<div class="childDiv2">
    <input type="text" id="txtID" class="txtClass"/>
    <p class="child">Blah Blah Blah</p>
</div>?
Run Code Online (Sandbox Code Playgroud)

JS

$('.txtClass');
$('#childDiv2 .txtClass')
$('#childDiv2 > .txtClass')
$('input.txtClass')
$('#childDiv2 input.txtClass')
Run Code Online (Sandbox Code Playgroud)

Fré*_*idi 45

现代浏览器公开了一个非常有效的getElementsByClassName()方法,该方法返回具有给定类的元素.这就是为什么单个类选择器在您的情况下更快.

详细说明你的例子:

$(".txtClass")                  =>  getElementsByClassName()

$("#childDiv2 .txtClass")       =>  getElementById(),
                                    then getElementsByClassName()

$("#childDiv2 > .txtClass")     =>  getElementById(),
                                    then iterate over children and check class

$("input.txtClass")             =>  getElementsByTagName(),
                                    then iterate over results and check class

$("#childDiv2 input.txtClass")  =>  getElementById(),
                                    then getElementsByTagName(),
                                    then iterate over results and check class
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,第一种形式在现代浏览器上最快是合乎逻辑的.

  • @Lanka,也许不是*不正确*,只是*过时*.技术进步,今天最好的性能建议可能在明年出错.另一方面,基准测试将为您提供最新数据. (3认同)

kla*_*aus 8

var obj = document.getElementById("childDiv");
xxx = obj.getElementsByClassName("txtClass");
Run Code Online (Sandbox Code Playgroud)

快了30倍.

http://jsperf.com/selectors-perf/6


And*_*eas 6

CSS选择器从右到左进行解析.所以你的榜样

$('#childDiv2 .txtClass')
Run Code Online (Sandbox Code Playgroud)

将采取两个行动来完成.首先用类找到所有元素txtClass.然后检查每个元素是否为具有id的元素的子元素childDiv2.

$('.txtClass')
Run Code Online (Sandbox Code Playgroud)

这个选择器只需一个动作.用类查找所有元素txtClass

在css-tricks.com上查看这篇文章