【问题标题】:jQuery: Adding context to a selector is much faster than refining your selector?jQuery:向选择器添加上下文比优化选择器要快得多?
【发布时间】:2010-10-13 15:29:54
【问题描述】:

我刚刚注意到向选择器添加上下文比优化选择器要快得多。

$('li',$('#bar')).append('bla');

比以下速度快两倍:

$('#bar li').append('bla');

这通常是真的吗?

【问题讨论】:

    标签: jquery css-selectors


    【解决方案1】:

    为选择器添加上下文是很多的 比优化选择器更快

    这在一般情况下是正确的。但是,对于您的具体示例,jQuery

    直到并包括 jQuery 1.2.6,选择器引擎以“自上而下”(或“从左到右”)的方式工作。这意味着您的两个示例都将像这样(大致)运行:

    var root = document.getElementById('bar');
    return root.getElementsByTagName('li');
    

    jQuery 1.3.x(即,jQuery 嵌入的Sizzleintroduced a "bottom up" (or "right to left") approach 用于查询 DOM。所以$('#bar li') 现在变成(大致):

    var results = [];
    var elements = document.getElementsByTagName('li');
    for(var i=0; i < elements.length; i++) {
        var element = elements[i];
        var parent = element.parentNode;
        while(parent) {
            if(parent.id == 'bar') {
                results.push(element)
                break;
            }
            parent = parent.parentNode;
        }
    }
    return results
    

    这两种方法各有利弊。您发现了其中一个缺点。

    编辑:刚刚从this discussion 发现,Sizzle 主干现在对 #id 优先的选择器进行了特殊豁免。它使用它作为根上下文,加快了速度。如果不能消除您看到的速度差异,这应该会减少。

    【讨论】:

      猜你喜欢
      • 2011-11-18
      • 2011-03-12
      • 2011-08-27
      • 2011-06-09
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      相关资源
      最近更新 更多