我知道在 jQuery 中如果我们使用ID
来选择元素,它非常高效。我对这个选择器有疑问:
请考虑这 3 个选择器:
$('#MyElement')
$('#Mytbl #MyElement')
$('#Mytbl .MyClass')
哪个更快,为什么?如何检查在 jQuery 中选择我的元素所用的时间?
我知道在 jQuery 中如果我们使用ID
来选择元素,它非常高效。我对这个选择器有疑问:
请考虑这 3 个选择器:
$('#MyElement')
$('#Mytbl #MyElement')
$('#Mytbl .MyClass')
哪个更快,为什么?如何检查在 jQuery 中选择我的元素所用的时间?
直接 ID 选择器总是最快的。
我根据您的问题创建了一个简单的测试用例...
http://jsperf.com/selector-test-id-id-id-id-class
选择嵌套 ID 是错误的,因为如果一个 ID 是唯一的(它应该是唯一的),那么它是否嵌套并不重要。
第一个是最快的,因为它只有 1 个要查找的属性。然而,
document.getElementById("MyElement")
不过,速度更快。它是原生 javascript,与 jQuery 不同,浏览器立即知道您想要做什么,而不必首先运行大量 jQuery 代码来确定您要查找的内容。
您可以使用jsPerf运行速度测试,以比较功能:Test Case。结果:
$('#MyElement')
Ops/sec: 967,509
92% slower
$('#Mytbl #MyElement')
Ops/sec: 83,837
99% slower
$('#Mytbl .MyClass')
Ops/sec: 49,413
100% slower
document.getElementById("MyElement")
Ops/sec: 10,857,632
fastest
不出所料,原生 getter 是最快的,其次是只有 1 个选择器的 jQuery getter,速度不到原生速度的 10%。带有 2 个参数的 jQuery getter 甚至无法接近原生代码的每秒操作数,尤其是类选择器,因为与 ID 相比,类通常应用于多个元素。(原生 ID 选择器在找到一个元素后停止搜索,我不确定 jQuery 是否也这样做。)
这是在一些 javascript 调用之间停止时间的方法
selectorTimes = [];
var start = new Date().getTime();
$('#MyElement')
selectorTimes.push(new Date().getTime()-start);
start = new Date().getTime()
$('#Mytbl #MyElement')
selectorTimes.push(new Date().getTime()-start);
start = new Date().getTime()
$('#Mytbl .MyClass')
selectorTimes.push(new Date().getTime()-start);
console.log(selectorTimes);
我认为第二个选择器效率不高,如果你有一个 domid 直接选择这个:$('#MyElement')
这个给你。请参阅每个示例顶部的注释:
//fastest because it is just one id lookup: document.getElementById("MyElement") with no further processing.
$('#MyElement')
//a little slower. JQuery interprets selectors from right to left so it first looks up for #MyElement and then checks if it is hosted in #Mytbl
$('#Mytbl #MyElement')
//the slowest of all. JQuery interprets selectors from right to left so it first finds all elements with .MyClass as their class and then searches for those hosted in #Mytbl.
$('#Mytbl .MyClass')
如果可以,请始终只使用 id(如第一个示例),但如果您必须将多个选择器和类链接在一起,请尝试将最严格的放在右侧。例如身份证。因为 JQuery 从右到左解释选择器。
几件事:
这些规则适用于 CSS,就像它们适用于 JavaScript 和 jQuery。
此外,如果您需要嵌套选择器,使用 $().find().find() 会更快
http://jsperf.com/selector-test-id-id-id-id-class/2
$('#Mytbl .MyClass')
$('#Mytbl').find('.MyClass')
后者快了大约 65%。
显然第一个$("#MyElement")
比其他更快 2.
访问具有其 id 的元素总是更快,但有时我们不得不在某个容器中找到一些元素。在这种情况下,我们更喜欢.find()
或.filter()
(取决于情况)。
选择器之间的区别取决于浏览器到浏览器。例如,如果您通过 IE 上的类访问它会比 FF 慢。使用类而不是 ID 访问元素时,FF 更快。
在您的第二个示例中,即,您在$("#mytbl #MyElement")
这里找到合法但不合适的方式。由于您已经知道元素的 ID(假设您的页面上只有一个具有此 ID 的元素),因此最好使用. 将首先读取#mytbl 并遍历以在其下找到#MyElement,因此既耗时又慢。#MyElement
#mytbl
$("#MyElement")
$("#mytbl #MyElement")
要测试不同的情况,您可以编写小片段以在循环中读取/访问至少 10000 个元素,否则很难确定哪种方式更快。
最快的将是:
$('#Mytbl', '#MytblContainer' );
因为在这种情况下,jquery 不必搜索整个 dom 树来查找“#Mytbl”。它只会在给定的范围内搜索。IE 它只会在 '#MytblContainer' 中搜索。
我会说第一个是最快的,因为您只是在搜索一个 id。
和
$('#Mytbl .MyClass')
是最慢的,因为您没有指定具有“MyClass”类的元素类型