2012-05-03 7 views
3

クラスやID、その他のセレクタを使用して要素の検索が高速かどうかについては、多くの疑問があります。私はそれに興味がありません。私はあなたが持っているかどうかを知りたい:キャッシュされたセレクタからDOMをトラバースする方が、DOM内のIDの要素を見つける方が速いのですか?

var link = $(this); //let's say you're in a click handler 

は、私は特定のためだけではなく、この質問をしてい

var container = link.closest('.container'); //assume container is .container 

または

var container = $('#mycontainer'); //assume same element as above 

を行うことで、コンテナを見つけるために、より速く、それをです上記のシナリオ(このシナリオでもOK、そうです)ではなく、キャッシュされたトラバーサルに対して、IDを持つ新鮮なjQueryオブジェクトを作成します。私は自分のコードの多くで、前者の方法(それはもっと動的になることができるので)をする傾向があることに気付きましたが、後者の方が速いのはいつも好奇心でした。

おかげ

+2

私の疑惑は、後者は高速ですが、テストしましたか?テストハーネスをノックするのはかなり簡単です... –

+0

この情報が古く、jQueryの最新の反復で修正されているかどうかはわかりませんが、 '.closest()'は比較的に確実です他の選択肢よりも遅い。 –

+1

私は実際にjsperfを作成しました:http://jsperf.com/cached-dom-traversal-vs-new-id-selectionがIDのように見えるのは間違いなく最も早く、次に見つかるクラスです。 – Jason

答えて

2

私はセレクタをキャッシュしたりない、と思うだろう、IDセレクタを使用するように速いだろう。 IDセレクタは、辞書検索のようなキャッシュされた/最も近い組み合わせと直接的な辞書検索のあとに、ツリートラバーサルが続くものです。

http://jsperf.com/traverse-from-cached-selector-vs-id-selector

最速のルックアップはネイティブdocumentGetElementById機能を使って行うことでしょう。

var container = $(document.getElementById('MyContainer')); 
+0

それは木を横断するのが一般的に遅いように見えます。キャッシュされたオブジェクトを使用して、そこを通過することがどれほど良いのか不思議です。 – Jason

+0

トラバースに関しては、通常、キャッシュされたオブジェクトを使用して子要素のコレクションを見つけます。 しかし、idを持つ単一の要素を見つけることになると、私は、私はidを持っています、私は($ cachedObject.find( '。untoggled-children'))toggle()toggleClass( 'untoggled-children toggled-children' '$(document.getElementById( 'myid'))'を常に使用します。 – jeremysawesome

関連する問題