要素を選択するためにjQueryを使用する場合ID
、それは非常に効率的です。このセレクターについて質問があります。
この 3 つのセレクターを検討してください。
$('#MyElement')
$('#Mytbl #MyElement')
$('#Mytbl .MyClass')
どちらが速いですか?なぜですか?jQueryで要素を選択するのにかかった時間を確認するにはどうすればよいですか?
要素を選択するためにjQueryを使用する場合ID
、それは非常に効率的です。このセレクターについて質問があります。
この 3 つのセレクターを検討してください。
$('#MyElement')
$('#Mytbl #MyElement')
$('#Mytbl .MyClass')
どちらが速いですか?なぜですか?jQueryで要素を選択するのにかかった時間を確認するにはどうすればよいですか?
ダイレクト ID セレクターは常に最速です。
あなたの質問に基づいて簡単なテストケースを作成しました...
http://jsperf.com/selector-test-id-id-id-id-class
ネストされた ID を選択するのは間違っています。ID が一意である必要がある場合は、ネストされているかどうかは関係ありません。
これは、いくつかのJavaScript呼び出し間の時間を停止する方法です
selectorTimes = [];
var start = new Date().getTime();
$('#MyElement')
selectorTimes.push(new Date().getTime()-start);
start = new Date().getTime()
$('#Mytbl #MyElement')
selectorTimes.push(new Date().getTime()-start);
start = new Date().getTime()
$('#Mytbl .MyClass')
selectorTimes.push(new Date().getTime()-start);
console.log(selectorTimes);
これを直接選択する domid がある場合、2 番目のセレクターは効率的ではないと思います: $('#MyElement')
最初のものは、検索するプロパティが 1 つしかないため、最も高速です。でも、
document.getElementById("MyElement")
ただし、さらに高速です。これはネイティブの JavaScript であり、jQuery とは異なり、最初に探しているものを把握するために大量の jQuery コードを実行する必要がなく、ブラウザーはユーザーが何をしたいのかをすぐに認識します。
jsPerfを使用して速度テストを実行し、関数を比較できます: Test Case。結果:
$('#MyElement')
Ops/sec: 967,509
92% slower
$('#Mytbl #MyElement')
Ops/sec: 83,837
99% slower
$('#Mytbl .MyClass')
Ops/sec: 49,413
100% slower
document.getElementById("MyElement")
Ops/sec: 10,857,632
fastest
予想通り、ネイティブの getter が最も高速で、次に jQuery の getter が続き、セレクターが 1 つしかなく、ネイティブの速度の 10% 未満です。2 つのパラメーターを持つ jQuery ゲッターは、ID と比較してクラスは通常複数の要素に適用されるため、ネイティブ コード、特にクラス セレクターの 1 秒あたりの操作に近づくことさえできません。(ネイティブ ID セレクターは、1 つの要素を見つけると検索を停止します。jQuery もそうするかどうかはわかりません。)
また、ネストされたセレクターが必要な場合は、 $().find().find() を使用する方が高速です
http://jsperf.com/selector-test-id-id-id-id-class/2
$('#Mytbl .MyClass')
$('#Mytbl').find('.MyClass')
後者は約 65% 高速です。
はい、どうぞ。各例の上にあるコメントを参照してください。
//fastest because it is just one id lookup: document.getElementById("MyElement") with no further processing.
$('#MyElement')
//a little slower. JQuery interprets selectors from right to left so it first looks up for #MyElement and then checks if it is hosted in #Mytbl
$('#Mytbl #MyElement')
//the slowest of all. JQuery interprets selectors from right to left so it first finds all elements with .MyClass as their class and then searches for those hosted in #Mytbl.
$('#Mytbl .MyClass')
可能であれば、常に id のみを使用してください (最初の例のように) が、複数のセレクターとクラスを連鎖させる必要がある場合は、最も厳密なものを右側に配置してください。たとえば、ID。JQuery はセレクターを右から左に解釈するためです。
いくつかのこと:
これらの規則は、JavaScript や jQuery と同様に CSS にも適用されます。
明らかに最初のもの$("#MyElement")
は、他の 2 よりも高速です
。id を持つ要素へのアクセスは常に高速ですが、コンテナ内の要素を見つける必要がある場合がありました。その場合、.find()
または.filter()
(状況に応じて)を優先します。
セレクターの違いは、ブラウザーごとに異なります。たとえば、IE のクラスを介してアクセスすると、FF よりも遅くなります。ID ではなくクラスで要素にアクセスする場合、FF の方が高速です。
あなたの2番目の例、つまり、ここでは、どの方法が合法であるが適切ではない$("#mytbl #MyElement")
かを見つけ#MyElement
ています。#mytbl
要素の ID は既にわかっているため (ページにこの ID を持つ要素が 1 つしかないと仮定して)、 を使用することをお勧めします$("#MyElement")
。$("#mytbl #MyElement")
最初に #mytbl を読み取り、トラバースしてその下の #MyElement を見つけるため、時間がかかり遅くなります。
さまざまなケースをテストするために、小さなスニペットを記述してループ内の少なくとも 10000 要素を読み取り/アクセスすることができます。
単純に 1 つの ID を検索しているため、最初の ID が最も速いと言えます。
と
$('#Mytbl .MyClass')
クラス「MyClass」を持つ要素のタイプを指定していないため、最も遅いです
最速は次のとおりです。
$('#Mytbl', '#MytblContainer' );
この場合、jquery は「#Mytbl」を見つけるために dom ツリー全体を検索する必要がないからです。指定されたスコープのみで検索します。IE では、「#MytblContainer」のみで検索されます。