$ (document) .on ('click', '#id', function () {}) vs $ ('# id'). on ('click', function () {}) [geschlossen]

81

Ich habe versucht herauszufinden, was der Unterschied zwischen ist

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

und

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

Ich konnte keine Informationen darüber finden, ob es einen Unterschied zwischen den beiden gibt und wenn ja, was dieser Unterschied sein könnte.

Kann jemand bitte erklären, ob es überhaupt einen Unterschied gibt?

Styphon
quelle
2
Haben Sie die Dokumentation gelesen oder auf dieser Website gesucht? Es sollten ein paar Millionen Antworten zur Auswahl stehen?
Adeneo
9
Sie werden "punkthungrige" Flusspferde bekommen, die darauf antworten, obwohl es klar dokumentiert ist. Der erste Code lautet "Wenn auf das Dokument geklickt wird, wenn es etwas mit der ID #id ist, dann lösen Sie diesen Code aus". Der zweite lautet: "Wenn auf etwas geklickt wird, das derzeit mit der ID #id vorhanden ist, wird dieser Code ausgelöst." Die erste dient zum Zuweisen des Ereignisses zu Elementen, die zu diesem Zeitpunkt noch nicht vorhanden sind, aber in Zukunft funktionieren werden. Der zweite wird nicht für später hinzugefügte Elemente ausgelöst.
Stellen Sie Monica Cellio
6
Ich habe beides gemacht, aber offensichtlich nicht gründlich genug. Eine Suche ist schwierig, weil ich nicht wusste, wonach ich suchen soll. Ich würde nicht wissen, wie das heißt.
Styphon
1
Es wird in der Dokumentation für erklärt on(). Nur einiges zu lesen :)
Stellen Sie Monica Cellio
8
Wenn dies als nicht konstruktiv geschlossen werden sollte oder weil Dokumentation dafür vorhanden ist, sollten ungefähr 99,9% der Fragen zum Stapelüberlauf geschlossen werden. In diesem Fall viel Glück beim Finden der verbleibenden 0,1%, da dies wahrscheinlich aus dem Geschäft gehen würde. Gleiches gilt für die abfällige Bemerkung "punkthungrige Flusspferde".
Cesoid

Antworten:

67

Das erste Beispiel zeigt die Ereignisdelegierung . Der Ereignishandler ist an ein Element höher im DOM-Baum (in diesem Fall das document) gebunden und wird ausgeführt, wenn ein Ereignis dieses Element erreicht, das von einem Element stammt, das mit dem Selektor übereinstimmt.

Dies ist möglich, weil die meisten DOM-Ereignisse den Baum vom Ursprungsort aus sprudeln lassen . Wenn Sie auf das #idElement klicken, wird ein Klickereignis generiert, das durch alle Vorfahrenelemente sprudelt ( Randnotiz: Es gibt tatsächlich eine Phase davor, die als "Erfassungsphase" bezeichnet wird, wenn das Ereignis den Baum hinunter zum Ziel ). Sie können das Ereignis für jeden dieser Vorfahren erfassen.

Das zweite Beispiel bindet den Ereignishandler direkt an das Element. Das Ereignis sprudelt weiterhin (es sei denn, Sie verhindern dies im Handler). Da der Handler jedoch an das Ziel gebunden ist, werden die Auswirkungen dieses Prozesses nicht angezeigt.

Durch Delegieren eines Ereignishandlers können Sie sicherstellen, dass er für Elemente ausgeführt wird, die zum Zeitpunkt der Bindung nicht im DOM vorhanden waren. Wenn Ihr #idElement nach Ihrem zweiten Beispiel erstellt wurde, würde Ihr Handler niemals ausgeführt. Durch die Bindung an ein Element, von dem Sie wissen, dass es sich zum Zeitpunkt der Ausführung definitiv im DOM befindet, stellen Sie sicher, dass Ihr Handler tatsächlich an etwas angehängt wird und später entsprechend ausgeführt werden kann.

James Allardice
quelle
1
Ich würde gerne wissen, welche Veranstaltung schneller delegiert wird. Ich möchte die Qualität meines Abfragecodes verbessern. Da das Delegieren von Ereignissen aus DOM etwas länger dauert als das Delegieren von Ereignissen aus #Element. Bitte teilen Sie Ihre Gedanken
Arun G
1
@ James Allardice - $(document).on('click', $('#id'), function()...Wie kann ich mit der letzteren Methode $(this)referenzieren $('#id')? $(this)bezieht sich derzeit document- was ich verstehe.
Cheshireoctopus
13

Betrachten Sie den folgenden Code

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

Nun, hier geht der Unterschied

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

Was ist, wenn wir erneut eine myTask hinzufügen?

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

Wenn Sie auf dieses myTask-Element klicken, wird es nicht aus der Liste entfernt, da keine Ereignishandler gebunden sind. Wenn wir stattdessen verwendet hätten .on, würde der neue Artikel ohne zusätzlichen Aufwand von unserer Seite funktionieren. So würde die .on-Version aussehen:

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

Zusammenfassung:

Der Unterschied zwischen .on()und besteht .click()darin, dass dies .click()möglicherweise nicht funktioniert, wenn die dem .click()Ereignis zugeordneten DOM-Elemente zu einem späteren Zeitpunkt dynamisch hinzugefügt werden, während .on()es in Situationen verwendet werden kann, in denen die dem .on()Aufruf zugeordneten DOM-Elemente zu einem späteren Zeitpunkt dynamisch generiert werden können.

Bhushan Firake
quelle
Bhushan, gibt es einen Grund, das erstere anstelle des letzteren zu verwenden?
Sean Magyar
@SzilardMagyar Ich denke, ich habe das im Abschnitt Zusammenfassung meiner Antwort beantwortet.
Bhushan Firake
Gute Information!
Abdul Aziz Al Basyir