Ich habe hier und an anderer Stelle im Internet einige Posts über die Unterschiede zwischen live()
und delegate()
gelesen. Ich habe jedoch die gesuchte Antwort nicht gefunden.
Ich weiß, dass der Unterschied zwischen live
und delegate
darin besteht, dass live
nicht in einer Kette verwendet werden kann. Ich habe auch irgendwo gelesen, dass delegate
in einigen Fällen schneller ist (bessere Leistung).
Meine Frage ist, gibt es eine Situation, in der Sie live
anstelle von delegate
verwenden sollten?
[~ # ~] Update [~ # ~]
Ich habe einen einfachen Test eingerichtet, um den Leistungsunterschied festzustellen.
Ich habe auch die neue Funktion .on()
hinzugefügt, die in jQuery 1.7+ verfügbar ist
Die Ergebnisse fassen die Leistungsprobleme, wie in den Antworten angegeben, ziemlich gut zusammen.
.live()
nur, wenn Ihre jQuery-Version .delegate()
nicht unterstützt..delegate()
nur, wenn Ihre jQuery-Version .on()
nicht unterstützt.Der Unterschied zwischen .live()
und .delegate()
ist VIEL größer als zwischen delegate()
und .on()
.
Ich benutze niemals live
; Ich halte die Vorteile der Verwendung von delegate
für so erheblich, dass sie überwältigend sind.
Der einzige Vorteil von live
ist, dass seine Syntax der von bind
sehr nahe kommt:
$('a.myClass').live('click', function() { ... });
delegate
verwendet jedoch eine etwas ausführlichere Syntax:
$('#containerElement').delegate('a.myClass', 'click', function() { ... });
Dies scheint mir jedoch viel expliziter zu sein, was tatsächlich passiert. Aus dem Beispiel live
geht nicht hervor, dass die Ereignisse tatsächlich in document
erfasst werden. mit delegate
ist klar, dass die Ereigniserfassung auf #containerElement
erfolgt. Sie können dasselbe mit live
tun, aber die Syntax wird immer schrecklicher.
Das Angeben eines Kontexts für die Erfassung Ihrer Ereignisse verbessert auch die Leistung. Im Beispiel live
muss jeder einzelne Klick auf das gesamte Dokument mit dem Selektor a.myClass
Verglichen werden, um festzustellen, ob er übereinstimmt. Bei delegate
sind das nur die Elemente innerhalb von #containerElement
. Dies wird offensichtlich die Leistung verbessern.
Schließlich erfordert live
, dass Ihr Browser nach a.myClass
sucht, ob es derzeit existiert oder nicht . delegate
sucht nur nach den Elementen, wenn die Ereignisse ausgelöst werden, was einen weiteren Leistungsvorteil ergibt.
NB delegate
verwendet live
hinter den Kulissen, sodass Sie mit live
alles tun können, was Sie mit delegate
tun können. Meine Antwort befasst sich mit ihnen, wie sie allgemein verwendet werden.
Beachten Sie auch, dass weder live
noch delegate
der beste Weg ist, eine Ereignisdelegierung in modernem jQuery durchzuführen. Die neue Syntax (ab jQuery 1.7) lautet mit der Funktion on
. Die Syntax lautet wie folgt:
$('#containerElement').on('click', 'a.myClass', function() { ... });
Sie sind genau gleich, außer:
.delegate()
können Sie den lokalen Bereich der Seite eingrenzen, während .live()
Ereignisse auf der gesamten Seite verarbeiten muss..live()
beginnt mit einer verschwendeten DOM-AuswahlWenn Sie .delegate()
aufrufen, dreht es sich nur um und ruft .live()
auf, übergibt jedoch den zusätzlichen Kontextparameter .
https://github.com/jquery/jquery/blob/master/src/event.js#L948-95
Als solches würde ich immer .delegate()
verwenden. Wenn Sie wirklich alle Ereignisse auf der Seite verarbeiten müssen, geben Sie einfach body
als Kontext an.
$(document.body).delegate('.someClass', 'click', function() {
// run handler
});
Ältere Versionen von jQuery haben tatsächlich die Funktionalität delegate
. Sie müssen nur einen Selektor oder ein Element als Kontexteigenschaft übergeben, wenn Sie .live()
aufrufen. Natürlich muss es auf der Seite geladen werden.
$('.someClass', '#someContainer').live('click',function() { // run handler });
Und Sie haben das gleiche Verhalten wie .delegate()
.
Zwei Situationen kommen in den Sinn:
Sie würden delegate
für das body
-Element verwenden, also können Sie stattdessen einfach live
verwenden, da dies einfacher ist.
Sie müssen eine ältere Version der jQuery-Bibliothek verwenden, in der das Ereignis delegate
noch nicht implementiert ist.
Betrachten Sie dieses Beispiel
<ul id="items">
<li> Click Me </li>
</ul>
$('#items').delegate('li', 'click', function() {
$(this).parent().append('<li>New Element</li>');
});
Indem wir ein DOM-Element als Kontext für unseren Selektor übergeben, können wir dafür sorgen, dass sich Live () (fast) so verhält wie delegate (). Der Handler wird an den Kontext und nicht an das Dokument angehängt. Dies ist der Standardkontext. Der folgende Code entspricht der oben gezeigten Version von delegate ().
$("li", $("#items")[0]).live("click", function() {
$(this).parent().append("<li>New Element</li>");
});
Sie sollten jedoch besser delegieren, um eine bessere Leistung zu erzielen siehe hier