In jQuery v1.7 wurde eine neue Methode on
hinzugefügt. Aus der Dokumentation:
'Die .on () -Methode hängt Ereignishandler an die aktuell ausgewählte Gruppe von Elementen im jQuery-Objekt an. Ab jQuery 1.7 bietet die .on () -Methode alle Funktionen, die zum Anhängen von Ereignishandlern erforderlich sind. '
Was ist der Unterschied zu live
und bind
?
Antworten:
on()
ist ein Versuch, die meisten Ereignisbindungsfunktionen von jQuery in einer zusammenzuführen. Dies hat den zusätzlichen Vorteil, die Ineffizienzen aufzuräumen mitlive
vsdelegate
. In zukünftigen Versionen von jQuery, werden diese Methoden entfernt und nuron
undone
werden bleiben.Beispiele:
Intern ordnet jQuery alle diese Methoden und Shorthand Event Handler-Setter der
on()
Methode zu, was weiter darauf hinweist, dass Sie diese Methoden von nun an ignorieren und nur Folgendes verwenden solltenon
:Siehe https://github.com/jquery/jquery/blob/1.7/src/event.js#L965 .
quelle
$(document.body).delegate("click", ".mySelector", fn);
sollte sein$(document.body).delegate(".mySelector", "click", fn);
on
ist in der Natur sehr nah andelegate
. Warum also nicht delegieren? Es ist, weilon
es nicht alleine kommt. Es gibt dieoff
Möglichkeit, das Ereignis aufzuheben undone
ein Ereignis zu erstellen, das nur einmal ausgeführt werden soll. Dies ist das "Paket" einer neuen Veranstaltung.Das Hauptproblem von
live
ist, dass es an "Fenster" angehängt wird und ein Klickereignis (oder ein anderes Ereignis) auf ein Element tief in der Seitenstruktur (das Dom) zwingt, um oben auf der Seite zu "sprudeln", um ein Ereignis zu finden Handler bereit, damit umzugehen. Auf jeder Ebene müssen alle Event-Handler überprüft werden. Dies kann sich schnell summieren, wenn Sie eine tiefe Imbrikation durchführen (<body><div><div><div><div><table><table><tbody><tr><td><div><div><div><ul><li><button> etc etc etc...
).So
bind
, wieclick
, wie andere Abkürzung Ereignis Bindemittel befestigen direkt auf das Ereignis - Ziel. Wenn Sie eine Tabelle mit beispielsweise 1000 Zeilen und 100 Spalten haben und jede der 100'000 Zellen ein Kontrollkästchen enthält, auf das Sie klicken möchten. Das Anhängen von 100'000 Ereignishandlern nimmt beim Laden der Seite viel Zeit in Anspruch. Das Erstellen eines einzelnen Ereignisses auf Tabellenebene und die Verwendung der Ereignisdelegierung ist um mehrere Größenordnungen effizienter. Das Ereignisziel wird zur Ereignisausführungszeit abgerufen. "this
" wird die Tabelle sein, aber "event.target
" wird Ihre übliche "this
" in einerclick
Funktion sein. Das Schöne daranon
ist, dass "this
" immer das Ereignisziel ist und nicht der Container, an den es angehängt ist.quelle
mit
.on
Methode ist es möglich , zu tun.live
,.delegate
und.bind
mit gleicher Funktion , aber mit.live()
nur.live()
möglich ist (Ereignisse Dokument delegiert).jQuery("#example").bind( "click", fn )
=jQuery( "#example").on( "click", fn );
jQuery("#example").delegate( ".examples", "click", fn )
=jQuery( "#example" ).on( "click", ".examples", fn )
jQuery("#example").live( fn )
=jQuery( document ).on( "click", "#example", fn )
Ich kann dies direkt aus der jQuery-Quelle bestätigen:
jQuery (this.context)?
this.context
===document
in den meisten Fällenquelle
(Mein Eröffnungssatz war sinnvoller, bevor Sie die Frage geändert haben. Ursprünglich hatten Sie gesagt: "Was ist der Unterschied zu
live
?")on
ist mehr wiedelegate
als es istlive
, es ist im Grunde eine einheitliche Form vonbind
unddelegate
(in der Tat sagte das Team, sein Zweck sei "... alle Möglichkeiten zum Anhängen von Ereignissen an ein Dokument zu vereinheitlichen ..." ).live
ist grundsätzlichon
(oderdelegate
) dem gesamten Dokument beigefügt. Es ist ab Version 1.7 zugunsten der Verwendung vonon
oder veraltetdelegate
. Ich vermute, dass wir in Zukunft nur Code verwendenon
werden, anstattbind
oderdelegate
(oderlive
) ...In der Praxis können Sie also:
Verwenden Sie
on
wiebind
:Verwenden Sie
on
likedelegate
(Ereignisdelegierung, die in einem bestimmten Element verwurzelt ist):Verwenden Sie
on
likelive
(Ereignisdelegation im Dokument verwurzelt):quelle
on
ist eine Kombination ausbind
unddelegate
, und wie gesagt, nicht sehr ähnlichlive
. Sie könnenon
like verwendenbind
(einen Handler direkt an ein Element anhängen) oderon
like verwendendelegate
(einen Handler an ein Element anhängen, aber das Ereignis nur auslösen, wenn das tatsächlich angeklickte Element mit einem Selektor übereinstimmt und als ob dieses Element dasjenige wäre, das das ist Ereignis ereignet am - z. B. Ereignisdelegation), oder Sie können es wie verwendenlive
(delegate
mit dem Dokument als Stamm). Es ist die Ereignisdelegation, die es nützlich macht, wenn Sie Elemente dynamisch hinzufügen.$("#id", ".class").live(fn)
=$(".class").delegate("#id", fn );
In der alten jQuery-Quelle wurde Live als allgemeiner Fall und Delegat als Sonderfall verwendet, was dies umso verwirrender machte, wenn Sie darüber nachdenken.delegate
schnell hinzugefügt haben , aber immer noch. :-)live ist jetzt die Abkürzung für .on ()
Auch dieser Beitrag kann für Sie nützlich sein. http://blog.jquery.com/2011/11/03/jquery-1-7-released/
quelle
Es gibt keine für den grundlegenden Anwendungsfall. Diese beiden Linien sind funktional gleich
.on () kann auch Ereignisdelegierungen durchführen und wird bevorzugt.
.bind () ist jetzt eigentlich nur ein Alias für .on (). Hier ist die Definition der Bindefunktion in 1.7.1
Die Idee zum Hinzufügen von .on () bestand darin, eine einheitliche Ereignis-API zu erstellen, anstatt mehrere Funktionen zum Binden von Ereignissen zu haben. .on () ersetzt .bind (), .live () und .delegate ().
quelle
Etwas, das Sie beachten sollten, wenn Sie die mit dem Element verknüpften Ereignishandler erhalten möchten - achten Sie darauf, an welches Element der Handler angehängt wurde!
Zum Beispiel, wenn Sie verwenden:
Sie erhalten die Ereignishandler mit:
Aber wenn Sie verwenden:
Sie erhalten die Ereignishandler mit:
(Im letzten Fall hat das relevante Ereignisobjekt den Selektor = ". mySelector")
quelle
events
ist sowieso undokumentiert und ich denke, es funktioniert nicht mehr in 1.9