2010-01-25 23 views
9

这更多的是好奇心问题。当执行以下操作:选择多个项目时的jQuery性能

$('.selector1, .selector2').doSomething() 

jQuery的是否完全遍历DOM两次获得各组的每个选择匹配的对象,或者是寻找在DOM的一个遍历所有元素?

+0

我不这么认为,因为从核心中看到的匹配是用各种节点属性(nodeName,NodeType,id等)的正则表达式完成的。所以任何一个选择器都会产生一次DOM迭代。但是,我不是100%正面的,所以我会推迟到其他人更熟悉内部:-) – prodigitalson 2010-01-25 23:27:28

+0

实际上这个例子是坏的,因为''节点不存在于HTML :) – 2010-01-26 08:38:11

+0

我认为你想要做的是找出选择器引擎Sizzle,你可以看看它的源代码:http://github.com/jeresig/sizzle/ http://github.com/jeresig/sizzle/blob/master/sizzle.js – artlung 2010-01-26 14:46:42

回答

1

我觉得它采用原生浏览器的功能来找到它,使用:

document.getElementsByClassName() 
1

这真的取决于浏览器。在较新的浏览器中,它将使用document.querySelectorAll来处理任何DOM查询(在这种情况下,这会为类调用document.getElementsByClassName)。在不支持这一点的旧版浏览器中,它必须自行计算出来,这显然会变慢。

一般而言,您应该首选按id搜索内容(或者至少缩小范围)。类和标签名称将是下一个速度。基本上,本地支持的DOM操作是最好的。

+0

这听起来像是在大多数情况下,它会每次遍历每个选择器的DOM。尽管遍历DOM的方式会根据选择器的类型(元素对ID还是类)而有所不同? – 2010-01-26 20:39:18

+0

是的,它将使用正则表达式来分割所有查询,并一次执行一个查询。不过,我不担心类或ID的性能。 – 2010-01-26 20:55:12