jquery和CSS中最快的选择器方法 - ID与否
Fastest selector method in jquery and CSS - ID or not?
jquery/javascript中最快的是什么?
$('#myID .myClass')
或
$('.myClass')
在 CSS 中最好使用什么?
#myID .myClass{}
或
.myClass{}
我现在明白了,我应该解释得更好。不好意思!
Ofceauce ID 在 CSS 和 JavaScript 中都是一个更快的选择器。但有时你需要使用类,因为有多个选择器。
例如,假设我有我的大 html 文档。在页面中间,我有:
<div id="myID">
<a class="myClass">link1</a>
<a class="myClass">link1</a>
<a class="myClass">link1</a>
</div>
如果我想定位所有"我的类"。那么,在定位类之前定位 ID 会更好吗?(这样我就不必对整个HTML文档进行domtravel了)例如:
会这样吗:
$('#myID').find('.myClass')
速度快于:
$('.myClass')
我在现代浏览器上的测试表明您应该选择其中之一,
$('#id').find('.class') // or
$('.class')
但不是,
$('#id .class')
原因是所有现代浏览器都实现了getElementsByClassName
导致按类名进行几乎恒定的时间查找(假设哈希实现)。哪些浏览器是现代的,这是另一个主观问题。
它们在大多数现代浏览器中大致相同,因为类名是在内部散列的。 不同之处在于,较旧的浏览器没有.getElementsByClassName
或等效的方法,因此.myClass
在内部解析为 jQuery,并且 dom 中的每个元素都被遍历并检查类名(或者在可能的情况下使用 XPath)。
尽可能始终尝试使用#myID .myClass
,因为它允许 jQuery 直接跳转到#myID
并在必要时从那里遍历。
逻辑上思考一下这个问题,并假装您对浏览器如何在内部构建或它如何访问 DOM 一无所知,但您假设它所做的一切都是合乎逻辑的。
因此,在两个选择器中,最窄的选择器会更快地找到您的结果,这难道不是合理的吗?
您有两个选择器,它们翻译成粗略的英语为
- 类的任何元素
myClass
ID 为myID
的元素的子元素 - 类的任何元素
myClass
至于"在CSS中最好使用什么",这完全是主观的,因为它取决于您是打算针对.myClass
的所有实例还是仅针对#myID
子实例
其实是个好问题。
假设您已经解析了 N 个最大深度为 D 的元素和 S 个规则数的 CSS 的 DOM。然后,为所有元素查找样式的任务的计算复杂度约为 O(N*D*S)
。
显然,并非所有的CSS选择器都具有相同的计算复杂性。
例如li.item
选择器和li[class ~= "item"]
需要与等效的 CPU 资源完全相同的 CPU 资源。 li[class = "item"]
可以更快地计算,因为它不需要扫描空格。
#1 选择器在这里:
#myID .myClass{} /* #1 */
.myClass{} /* #2 */
需要更多的 CPU 资源,因为您需要执行与情况 #2 完全相同的工作量,此外,您需要扫描父/子链(最多 D 个元素)以找到带有"myID"的元素。
这就是纯CSS选择器的全部内容。
在jQuery和朋友的情况下可能有点不同。从理论上讲,jQuery引擎可以使用document.getElementById()
来最小化查找集(因此减少N个数字),但这与CSS行为不匹配。下面是一个例子:http://jsfiddle.net/dnsUF/.在这里,jQuery报告了一个带有#foo
元素,但实际上有两个这样的元素。
恢复:
- 在 CSS 案例中 #2 更快
- 在jQuery中,#1可以更快(但从技术上讲,在CSS意义上可能不正确)。
这是我关于CSS选择器复杂性的文章:http://www.terrainformatica.com/2008/07/csss-and-computational-complexity-of-selectors/这是如何使用样式集改进它的方法之一:http://www.terrainformatica.com/2010/09/style-sets-in-h-smile-core/
ID 始终是访问元素的最快方式,因为它们是唯一的。
是的,id 是访问元素的最快方法之一。看看这个测试 http://mootools.net/slickspeed/。
#myID .myClass
绝对是访问元素的更好方法,假设您有许多应用了.myClass
的元素。
2015 - 在这里
检查自己https://jsperf.com/id-vs-class-vs-tag-selectors/2
博士;
在 Linux 64 位上使用 ID $("#foo") 比我的 chrome 41 上的 CSS $(".bar") 快近 4 倍
- 如何在jQuery的.on()方法中动态更新按钮的ID选择器
- 有没有办法将选择器返回到元素?是$(这个)还是其他方法
- 通过类选择器单独调用方法
- 如何使用jQuery扩展方法为元素或类选择器创建自定义插件
- MVC4和日期选择器:“;0x800a01b6-JavaScript运行时错误:对象没有't支持属性或方法
- 为什么jQuery选择器函数与原生DOM方法相比如此缓慢
- Kendo日期选择器值方法没有't引发自己的变革事件
- 从任何jquery选择器字符串创建元素的最有效方法
- 有没有更好的方法来访问用JQuery选择器选择的第一个元素
- jQuery方法找不到选择器
- 使用:nth-child()选择器和.get()方法之间的性能差异
- 有没有一种方法可以让jQuery日期选择器在没有年份的情况下工作
- 我可以在 jQuery 过滤器方法上使用多选择器表达式吗?
- Rally SDK 2 标签选择器是否有必填字段?对象没有方法'getContextPath'
- 在 IE11 中添加子项时未更新空选择器的解决方法
- 日期选择器 getDate 方法在第二次单击时工作并显示上一个选定的日期
- 使用 prompt() 方法时显示日期选择器
- 警告:失败的 propType:在“维度选取器”中未指定所需的属性“维度名称”.检查“连接(维度选择器)”的渲染方法
- 如何检查是否已在给定的jQuery选择器上调用了方法
- 提高jQuery代码性能的方法[选择器角度]