高效的DOM选择技术 - 按属性选择是否缓慢?

时间:2011-02-22 22:16:43

标签: jquery jquery-selectors placeholder

我正在使用一个脚本来使所有输入在浏览器中都有一个占位符,但还不支持该功能。

在该脚本中我正在使用

$('input[placeholder]').each(function() {

选择要处理的所有元素。

我想知道这可能会慢,因为它不是一个非常具体的选择,如

$('#input').each(function() {

我知道选择方式更快(但我不想单独指定所有id)。

您是否建议使用占位符属性向所有输入添加类,如下所示:

$('.iHaveaPlaceholder').each(function() {

使选择更快(我认为按类选择比通过属性更快)。但是这会误用css类的目的只意味着风格,它会填满dom。

您是否有任何改进这些任务的建议或技巧?

4 个答案:

答案 0 :(得分:3)

我继续做了JSPerf,用于将选择器input[placeholder].hasPlaceholderinput.filter()进行比较。

现在我们要考虑一些数字,让我们谈谈你想知道的原因。

您何时搜索'input[placeholder]'?希望只有一次。如果您在现代浏览器中执行这些选择器中的任何一个,它们将非常快速(数字是每秒操作数....)。但是,如果您知道只在不支持占位符的浏览器上运行此选择器,则列出的三种方法中,.hasPlacehoder实际上是IE 6中最慢的,自定义过滤器获胜。您希望尝试在此代码实际影响的浏览器中测试性能。

随意添加您自己的选择器,甚至更接近您的确切HTML到该页面并征求一些浏览器测试!

编辑:我在比赛中添加input.hasPlaceholder新的比赛......

答案 1 :(得分:2)

除非你有一个庞大的DOM,否则我认为性能差异不应该发挥作用。为了“优化”而设置了很多类,就像你说的那样,会混淆你文档的逻辑结构。

按类选择而不提供上下文仍然会导致遍历整个DOM。我认为按元素选择也是如此。在这里使用占位符类绝对不是答案。你想要做的是找到具有特定属性的所有输入元素 - 并且你正在为此目的使用正确的选择器。

答案 2 :(得分:0)

好吧,你可以给你的表单一个id,然后使用$("#theForm input[placeholder]"),这将减少选择器必须考虑的元素数量。

答案 3 :(得分:0)

这不慢(你测试过或只是推测?)。 但是如果是,请使用类。