jQueryのパフォーマンスをよりよく理解するために、次の質問に出くわしました。クリックイベントをリスト内のアイテムにバインドするための2つのほぼ等しいソリューションを検討してください。
リストアイテム:
<div id="items">
<div class="item"><a href="#">One</a></div>
<div class="item"><a href="#">Two</a></div>
<div class="item"><a href="#">Three</a></div>
</div>
<div id="items2">
<div class="item"><a href="#">One</a></div>
<div class="item"><a href="#">Two</a></div>
<div class="item"><a href="#">Three</a></div>
</div>
ID以外に2つのIDリストがあることに注意してください。ここで、次のjQueryを検討して、item
s内の各アンカーのクライアントイベントをバインドします。
$('#items').on('click', '.item a', function(e) {
console.log("### Items click");
});
$('#items2 .item a').on('click', function(e) {
console.log("### Items2 click");
});
これにより、リスト内のアイテムをクリックするとそれぞれのメッセージが出力されるという同じ結果が得られます。
バインドされているイベントを監視すると、最初のケースでは、クリックイベントが#items
コンテナにバインドされており、子にバインドされているイベントはありません。ただし、2番目のケースでは、クリックイベントは親にバインドされていません#items2
が、子要素のそれぞれにクリックイベントがあります。
さて、私の質問は次のとおりです。一方が他方よりも明らかに好ましいのでしょうか。ナイーブなので、最初のケースが望ましいと思いますが、jQueryの内部に関する知識が不足しているため、この2つは内部的には同等である可能性が非常に高くなります。
2つのケースを示すためにフィドルを用意しました。jQueryが要素に対して構築したイベントを観察することで、上記の仮定を導き出しました(Webブラウザーのコンソールで出力を確認できます)。