【问题标题】:jQuery optimization: Check if an element exists, fast?jQuery优化:检查元素是否存在,快吗?
【发布时间】:2013-04-25 15:45:37
【问题描述】:

在 jQuery 中,我已经知道如何使用特定选择器返回的 jQuery 对象的长度属性来检查元素是否存在。

但是,在内部,这意味着 jQuery 首先抓取所有对象,然后获取长度。出于性能原因,我想看看是否只有 1 个元素存在,我不需要抓取其余的。

我该怎么做?

【问题讨论】:

  • 为它分配一个 id 或一个类。并单独获取该类。
  • 如果你可以通过提供一个应该加快它的上下文来缩小范围。
  • 我不知道为什么这被否决了。

标签: jquery


【解决方案1】:

查看相关问题:Optimize jQuery selector with :first

我已经分支了一个 jsPerf 测试,比较 $("xxx:first")$("xxx").first() 以查看 jQuery 是否经过优化,以便在使用 :first 时尽早退出匹配。好像没有那个优化:

http://jsperf.com/does-first-boost-your-selector/4

更新:.eq(0):eq(0) 的行为方式相同。

所以,你可能不走运。似乎没有更有效的方式来挑选/检查第一场比赛。当然,除非您可以选择将选择器限制为类和 id,正如其他人所指出的那样,并且在我链接到的另一个问题中也已指出。

【讨论】:

  • 在查看@Ryan's answer 以获取有关它的评论时,我发现jQuery supporting 你的结论是:first 没有帮助。他们实际上建议做一个纯 CSS 选择器,后跟 .filter(":first"),因为原生 DOM 方法对 :first 没有帮助。
【解决方案2】:

当我想检查是否存在未被 ID 选择的元素,并且性能是一个问题时,我使用 document.querySelector() 而不是 jQuery。

querySelectorAll() 不同,querySelector() 似乎只选择第一个匹配的元素,提供了一种检查元素是否存在的有效方法。

例子

if(document.querySelector('a')){
   console.log('This document contains at least one anchor tag!');
}

您也可以通过从 jquery 对象中选择来做到这一点

var element = $('#super_special_element');

if(element.get(0).querySelector('a')){
    console.log('Super special element contains at least one anchor tag!');
}

【讨论】:

    【解决方案3】:

    如果元素有 id,您可以使用 document.getElementById(id),这是查找任何 dom 元素的最快方法。

    在 dom 中,您可以使用 getElementsByTagName 按标签名称查找元素。

    对于所有其他情况,请使用 JQuery。

    document.getElementById(id);
    document.getElementById(id).getElementsByTagName(tag);
    

    【讨论】:

      【解决方案4】:

      我不确定这是否会提高性能,但您可以使用选择器进行过滤,只返回第一个匹配的元素。试试这个?

      var exists = !$("selector:eq(0)").length == 0;
      

      【讨论】:

      • 如果否决票是因为我错了,请纠正我,让我知道我错了。谢谢!
      • 您最初的回答(在您编辑之前)没有回答问题。现在是。
      • 第一:我没有投反对票。根据the documentation:first等价于:eq(0)。它还说“最佳性能”是通过“使用纯 CSS 选择器,然后 [使用] .filter(":first")”来实现的。不能保证,但这肯定意味着:first(以及扩展名:eq(0))没有捷径可走。
      猜你喜欢
      • 2014-02-17
      • 2011-06-26
      • 2011-07-14
      • 2011-03-25
      • 2012-12-05
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多