代码之家  ›  专栏  ›  技术社区  ›  Stephen

优化jQuery选择器-哪个更快?

  •  2
  • Stephen  · 技术社区  · 15 年前

    $('#something div.else'); // find multiple divs with class .else
    

    $('#something').children('div.else');
    

    我正在尽最大努力优化一个包含数百个返回元素的页面,这些元素似乎挂在办公室的某台糟糕的计算机上(必须使用internetexplorer::shubder::)。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Nick Craver    15 年前

    但是 任何 后代 div.else ,其他只找到 直接的 孩子们 其他部门 .

    这取决于你的DOM,哪一个更快,第二个的等价物是:

    $('#something > div.else');
    

    它使用 child selector . 他们应该是 非常 , 关闭,在任何情况下,我怀疑从一个ID下降的选择器是你的问题领域,我想你会发现你在JS的绝大多数时间都花在其他地方。

    为了诊断速度问题,找一个剖析器,特别是有一个很棒的免费的叫做 dynaTrace AJAX Edition . 抓住它, follow the short tutorials 在他们的网站上…你会很快找到你在IE中的疼痛区域。

        2
  •  0
  •   Steffen    15 年前

    在您的情况下,如果有可能,当您能够选择一个不寻常的标记名时,您可能会获得相当多的性能:

    $("#container blockquote.else")
    

    编辑:刚刚看到尼克的答案,他是对的,那个笨蛋只需要检查直接的孩子。等效的第一个是:

    $("#container > div.else")
    
        3
  •  0
  •   jAndy    15 年前

    $('#something div.else');
    

    通过优化 Sizzle (在jquerylib中传递)到

    $('#something').find('div.else');
    

    如果没有这种优化,它 慢点,因为选择引擎 sizzle 正确的 . 所以,它会匹配所有 divs 和全班同学在一起 else 然后检查哪一个 #something 作为父母。

    编辑

    这个 Sizzle optimazation 速度较慢 这项任务已经完成,而且 函数在途中被调用

    一般来说,使用 jQuery functions 速度要快得多。例如jQuerys .eq() 函数将使用 array slice 减少jQuery对象的wrappet集 :eq() 选择器将调用sizzle。

    如果在你的例子中, div.else 元素是 , .children() 将击败 .find() 也将查找 全部的 后代(及其子女)。

        4
  •  0
  •   manixrock    15 年前

    #something div.else 在IE6中。由于jQuery使用Sizzle,因此它将首先查找全部 div ,然后按 else 类,并与 #something 身份证件。

    您可以尝试使用另一种标记类型,而不是 ,一个在你的页面中没有使用的,比如 blockquote . 只要用css重置它的样式,使它看起来像一个普通的div,然后将选择器改为 #something blockquote.else 应该快一点。