【问题标题】:jQuery: reduce DOM traversal by selecting elements out of variable? [closed]jQuery:通过从变量中选择元素来减少 DOM 遍历? [关闭]
【发布时间】:2013-05-25 05:27:32
【问题描述】:

我有一长串 DOM 元素,我从中获取属性以保存到对象中。

一遍又一遍地使用 jQuery 选择器似乎是对 DOM 操作的过度使用。

var a = $('input[name=a]:checked').val(),
    b = $('input[name=b]')is(':checked'),
    c = $('input[name=c]').val();

我认为可能有一种方法可以执行var $form = $('#form'); 之类的操作,然后使用$form.find('input[name=a]:checked')$form.children('input[name=b]')$form.filter('input[name=c]')。但是这些例子都没有了。我相信因为我没有选择元素本身,所以选择它们的父元素不会阻止 jQuery 不得不反复阅读 DOM。这是真的吗?

另一种选择可能是专门为此 (:/) 向所有元素添加另一个类,但出于某种原因,这似乎很奇怪。不过,它给我一个数组,我认为我可以用它来防止重复的 DOM 遍历?像这样的:

var $formElementArray = $('.the_elements_you_wanted');

然后使用过滤器?

var a = $formElementArray.filter('input[name=a]:checked').val(),
    b = $formElementArray.filter('input[name=b]')is(':checked'),
    c = $formElementArray.filter('input[name=c]').val();`

这是最好的方法吗?这种事情有最佳实践吗? 我必须专门添加一个类来防止过多的 DOM 遍历似乎有点蹩脚,因为我正在操作的一些元素不会被组合在一起,但如果是这样的话,c'est la vie .

【问题讨论】:

  • 如果元素很多,最好的方法是使用.filter()方法。如果您担心性能,请使用 Vanilla JavaScript 而不是 jQuery。
  • 所有性能问题都应该通过在 jsFiddle 等性能测量框架中测试您的替代方案来解决。最好的办法是将 id 放在这些元素上,以便您可以直接使用 document.getElementById('myInputA')$('#myInputA') 选择它们,如果您仍想使用 jQuery。
  • 您是否同时拥有页面上的所有元素,或者您会在页面加载后动态添加更多元素?您的完整 HTML 是什么样的?你想从 DOM 节点获取什么东西?只是:checkedval()
  • @Dogbert 在这种情况下,我没有动态添加元素,是的——到目前为止只是检查和验证。不要以为我必须检查这些以外的任何东西。

标签: jquery performance dom


【解决方案1】:

正如我在 cmets 中所建议的,如果您真的想知道答案,则必须测试任何此类性能问题,并且您可能必须在多个不同的浏览器中进行测试。

下面是五个不同场景的简单测试用例:http://jsperf.com/scoped-selector-perf-test

  1. 按名称全局搜索(您的原始代码)
  2. 将搜索范围仅限于父表单
  3. 给每个项目一个唯一的id,直接搜索id就行了
  4. 使用通用类并按名称从通用类中过滤每个项目
  5. 按 id 使用纯 javascript

在 Chrome v26 中运行这些 jQuery 选项 (1-4),通过唯一 id 搜索每个项目是最快的。比按名称进行全局搜索快 13 倍,比过滤公共类快 7 倍,比限定到父表单的范围快 4 倍。

按 id 进行的普通 javascript 搜索比最快的 jQuery 选项快 17 倍,比原始代码快 223 倍。在 Firefox 和 IE10 中也看到了类似的结果。

一些结论:

  1. 将搜索范围限定为共同的父级确实有帮助,但不如使用更快的选择器开始
  2. tag[name="xxx"] 搜索速度很慢
  3. 按 id 搜索很快
  4. document.getElementById("a") 明显快于 $('#a')

【讨论】:

  • 哇。我知道 jQuery 比较慢,但我不知道它慢了这么多!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
相关资源
最近更新 更多