选择多个项目时的jQuery性能表现

9

这更多是一个好奇的问题。当进行以下操作时:

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

jQuery是否需要完全遍历DOM两次来获取与每个选择器匹配的对象集,还是它在一次DOM遍历中找到所有元素?

我不这么认为,因为从我在核心代码中看到的情况来看,匹配是通过正则表达式在各种节点属性上进行的(nodeName、NodeType、id等)。因此,任何单个选择器产生的都是DOM的一个迭代。但是,我并不完全确定,所以我会听取更熟悉内部工作的人的意见 :-) - prodigitalson
实际上,这个例子很糟糕,因为HTML中不存在<selector2>节点 :) - KARASZI István
我认为你想要做的是寻找选择器引擎Sizzle,你可以查看它的源代码:http://github.com/jeresig/sizzle/ http://github.com/jeresig/sizzle/blob/master/sizzle.js - artlung
@KARASZI “哎呀!被一个打字错误给坑了!我会修复的。;o)” - DA.
2个回答

1

我认为它使用本地浏览器功能来查找,使用:

document.getElementsByClassName()

1

这真的取决于浏览器。在较新的浏览器中,它将使用document.querySelectorAll进行任何DOM查询(在幕后,这将调用document.getElementsByClassName来获取类)。在不支持此功能的旧浏览器中,它必须自己解决,这显然会更慢。

一般来说,您应该首先通过id查找内容(或至少缩小范围)。速度方面,类和标记名称将是下一个选择。基本上,最好使用本地支持的DOM操作。


听起来在大多数情况下,每个选择器都需要遍历DOM。但是根据选择器的类型(元素 vs. ID vs. class),它遍历DOM的方式会有所不同。 - DA.
是的,它将使用正则表达式来拆分您的所有查询并逐个执行。不过,我不会担心类或ID的性能问题。 - Keith Rousseau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接