jQuery:向选择器添加上下文比提炼选择器快得多吗?

我只是注意到,添加上下文到选择器比提炼选择器要快得多.

$( ‘礼’,$( ‘#条’))追加( ‘BLA’);

是速度的两倍:

$(‘#bar li’).append(‘bla’);

这一般是正确的吗?

adding context to the selector is much
faster than refining your selector

这在一般情况下是正确的.关于你的具体例子,jQuery< = 1.2.6并不一定是真的. 直到并包括jQuery 1.2.6,选择器引擎以“自顶向下”(或“从左到右”)的方式工作.这意味着你的例子都会这样操作(大致):

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

jQuery 1.3.x(即,jQuery嵌入的Sizzle)introduced 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是第一个选择器的特殊豁免.它使用它作为根的上下文,加快了一些事情.如果不能消除您所看到的速度差异,这应该会减少.

翻译自:https://stackoverflow.com/questions/650860/jquery-adding-context-to-a-selector-is-much-faster-than-refining-your-selector

转载注明原文:jQuery:向选择器添加上下文比提炼选择器快得多吗?