指定 - jquery セレクタ 引数



jQueryの:セレクタにコンテキストを追加すると、セレクタを洗練するよりもはるかに高速ですか? (1)

セレクタにコンテキストを追加するほうが、セレクタを改良するよりもはるかに高速です。

これは一般的な場合に当てはまります。 しかしあなたの特定の例に関してはjQuery <= 1.2.6には必ずしも当てはまりません。

jQuery 1.2.6までは、セレクターエンジンは "トップダウン"(または "左から右")に動作しました。 両方の例が(大体)次のように動作することを意味します。

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

jQuery 1.3.x(つまり、jQueryが組み込んでいるSizzleでは 、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

どちらの方法にも利点と欠点があります。 あなたは欠点の一つを見つけました。

編集この議論から、Sizzleトランクが#idが最初のセレクタを特別に除外することがわかりました。 それをルートコンテキストとして使って、物事を少しスピードアップします。 あなたが見ている速度の違いを排除しないのであれば、これは減少するはずです。

私はちょうどセレクタにコンテキストを追加する方があなたのセレクタを洗練するよりはるかに速いことに気付きました。

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

2倍速いです:

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

これは一般的に本当ですか?





css-selectors