$(document).on( 'click'、 '#id'、function(){})vs $( '#id')。on( 'click'、function(){})[closed]


82

私は違いは何であるかを見つけようとしていました

$(document).on('click', '#id', function(){});

そして

$('#id').on('click', function(){});

2つの間に違いがあるかどうか、もしそうなら、その違いが何であるかについての情報を見つけることができませんでした。

何か違いがあれば説明してもらえますか?


2
ドキュメントを読んだか、このサイトで検索しましたか。から選択する数百万の答えがあるはずですか?
adeneo 2013

9
それが明確に文書化されているという事実にもかかわらず、あなたはこれに答える「ポイント空腹」のカバを得るでしょう。最初のコードは、「ドキュメントがクリックされたときに、IDが#idのドキュメントである場合は、このコードをトリガーする」と述べています。2つ目は、「現在IDが#idであるものがクリックされたら、このコードをトリガーする」というものです。1つ目は、その時点では存在しないが将来的には存在する要素にイベントを割り当てるためのものです。2つ目は、後で追加された要素に対しては起動しません。
モニカチェリオを復活させる2013

6
私は両方を行いましたが、明らかに十分ではありませんでした。何を検索すればいいのかわからなかったので、検索は大変です。これが何と呼ばれているのかわかりません。
スタイフォン2013

1
のドキュメントで説明されていますon()。やるべきことをかなり読んでください:)
モニカチェリオを復活させる2013

8
これが建設的ではないとして、またはドキュメントが存在するために閉じる必要がある場合は、stackoverflowの質問の約99.9%を閉じる必要があります。その場合、残りの0.1%はおそらく廃業するため、幸運を祈ります。蔑称的な「ポイント空腹のカバ」の発言についても同じことが言えます。
cesoid 2016

回答:


68

最初の例は、イベントの委任を示しています。イベントハンドラーは、DOMツリーの上位の要素(この場合はdocument)にバインドされ、セレクターに一致する要素で発生したイベントがその要素に到達したときに実行されます。

これが可能なのは、ほとんどのDOMイベントが起点からツリーをバブルアップするためです。#id要素をクリックすると、クリックイベントが生成され、すべての祖先要素を介してバブルアップします(補足:イベントがツリーを下ってツリーに到達すると、実際には「キャプチャフェーズ」と呼ばれるこの前のフェーズがあります。ターゲット)。これらの祖先のいずれかでイベントをキャプチャできます。

2番目の例では、イベントハンドラーを要素に直接バインドします。イベントは引き続きバブルしますが(ハンドラーでそれを防止しない限り)、ハンドラーはターゲットにバインドされているため、このプロセスの効果は表示されません。

イベントハンドラーを委任することにより、バインド時にDOMに存在しなかった要素に対して確実に実行されるようにすることができます。あなたの場合は#id要素はあなたの第二の例の後に作成された、あなたのハンドラは実行しないでしょう。実行時に確実にDOMにあることがわかっている要素にバインドすることで、ハンドラーが実際に何かにアタッチされ、後で必要に応じて実行できるようになります。


1
どちらがイベントをより早く委任するのか知りたいのですが。jqueryコードの品質を向上させたい。DOMからのイベントの委任は、#Elementからのイベントの委任よりも少し時間がかかるためです。あなたの考えを共有してください
Arun G

1
@James Allardice-後者の方法$(document).on('click', $('#id'), function()...を使用$(this)して、どのように参照に使用できます$('#id')か?$(this)現在参照していますdocument-私は理解しています。
cheshireoctopus 2014

13

次のコードを検討してください

<ul id="myTask">
  <li>Coding</li>
  <li>Answering</li>
  <li>Getting Paid</li>
</ul>

さて、ここに違いがあります

// Remove the myTask item when clicked.
$('#myTask').children().click(function () {
  $(this).remove()
});

では、myTaskを再度追加するとどうなるでしょうか。

$('#myTask').append('<li>Answer this question on SO</li>');

このmyTaskアイテムをクリックしても、イベントハンドラーがバインドされていないため、リストから削除されません。代わりにを使用した.on場合、新しいアイテムは私たちの側で特別な努力をしなくても機能します。.onバージョンは次のようになります。

$('#myTask').on('click', 'li', function (event) {
  $(event.target).remove()
});

概要:

.on().click()それがあろう.click()と関連付けられたDOM要素ときに動作しない可能性があり.click()ながらイベントは後の時点で動的に追加されている.on()関連付けられたDOM要素の状況で使用することができる.on()呼が後の時点で、動的に生成されてもよいです。


ブーシャン、後者ではなく前者を使う理由はありますか?
Sean Magyar

@SzilardMagyar I私は私の答えの概要セクションであることに答えていると思います...
BhushanのFirake

良い情報!
Abdul Aziz Al Basyir 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.