Ich verwende jQuery v.1.7.1, wo die .live () -Methode anscheinend veraltet ist.
Das Problem, das ich habe, ist, dass beim dynamischen Laden von HTML in ein Element mit:
$('#parent').load("http://...");
Wenn ich danach versuche, ein Klickereignis hinzuzufügen, wird das Ereignis mit keiner der folgenden Methoden registriert:
$('#parent').click(function() ...);
oder
// according to documentation this should be used instead of .live()
$('#child').on('click', function() ...);
Was ist der richtige Weg, um diese Funktionalität zu erreichen? Es scheint nur mit .live () für mich zu funktionieren, aber ich sollte diese Methode nicht verwenden. Beachten Sie, dass #child ein dynamisch geladenes Element ist.
Vielen Dank.
.live()
ansehen, erfahren Sie, wie Sie vorhandene Verwendungen von.live()
zu verwenden.delegate()
oder umschreiben.on()
(je nachdem, ob Sie Version 1.7+ verwenden oder nicht). Beachten Sie jedoch, dass, wenn Sie einen Handler mit.click()
"after" hinzufügen, wie Sie bereits erwähnt haben, dh nach dem dynamischen Laden von Elementen, dies funktionieren sollte - das einzige Problem besteht darin,.click()
vor dem dynamischen Laden von Elementen eine Zuweisung vorzunehmen.Antworten:
Wenn der Click-Handler für ein Element funktionieren soll, das dynamisch geladen wird, legen Sie den Event-Handler für ein übergeordnetes Objekt fest (das nicht dynamisch geladen wird) und geben ihm einen Selektor, der Ihrem dynamischen Objekt wie folgt entspricht:
Der Ereignishandler wird an das
#parent
Objekt angehängt, und jedes Mal, wenn ein Klickereignis auf das Objekt sprudelt, das seinen Ursprung hat#child
, wird Ihr Klickhandler ausgelöst. Dies wird als delegierte Ereignisbehandlung bezeichnet (die Ereignisbehandlung wird an ein übergeordnetes Objekt delegiert).Dies geschieht auf diese Weise, da Sie das Ereignis an das
#parent
Objekt anhängen können, auch wenn das#child
Objekt noch nicht vorhanden ist. Wenn es jedoch später vorhanden ist und angeklickt wird, sprudelt das Klickereignis zum#parent
Objekt und zeigt an, dass es von#child
und stammt Es gibt einen Ereignishandler zum Klicken#child
und Auslösen Ihres Ereignisses.quelle
live()
vs.on()
aber heute habe ich beschlossen , noch einmal zu versuchen, und Ihre Erklärung enthüllen sofort , was ich die ganze Zeit gefehlt hatte. Vielen Dank!mouseenter
undmouseleave
Ereignisse und Test innerhalb des Handlers , die ein ausgelöst wurde. Das Pseudo-Hover-Ereignis von jQuery ist bei der Delegierung nicht verfügbar.Versuche dies:
Aus der
$.on()
Dokumentation:Ihr
#child
Element existiert nicht, wenn Sie es aufrufen$.on()
, daher ist das Ereignis nicht gebunden (im Gegensatz zu$.live()
).#parent
Jedoch tut exist, so verbindlich das Ereignis , dass in Ordnung ist.Das zweite Argument in meinem obigen Code fungiert als 'Filter', der nur ausgelöst wird, wenn das Ereignis bis
#parent
von sprudelt#child
.quelle
.load()
Methode aufrufen - nicht vom Code nach der.load()
Methode.#child
Es ist nur bekannt, dass es geladen wird, wenn der Success-Handler tatsächlich ausgeführt wird und nicht vorher.$(document).on('click', '.selector', function() { /* do stuff */ });
EDIT: Ich gebe ein bisschen mehr Informationen darüber, wie das funktioniert, weil ... Worte. In diesem Beispiel platzieren Sie einen Listener für das gesamte Dokument.
Wenn Sie
click
mit einem oder mehreren Elementen übereinstimmen.selector
, sprudelt das Ereignis bis zum Hauptdokument - solange es keine anderen Listener gibt, die dieevent.stopPropagation()
Methode aufrufen -, wodurch das Sprudeln eines Ereignisses zu übergeordneten Elementen übertroffen wird.Anstatt an ein bestimmtes Element oder eine bestimmte Gruppe von Elementen zu binden, warten Sie auf Ereignisse, die von Elementen stammen, die dem angegebenen Selektor entsprechen. Dies bedeutet, dass Sie einmal einen Listener erstellen können, der automatisch den aktuell vorhandenen Elementen sowie allen dynamisch hinzugefügten Elementen entspricht.
Dies ist aus mehreren Gründen sinnvoll, einschließlich Leistung und Speichernutzung (in großen Anwendungen).
BEARBEITEN:
Offensichtlich ist das nächstgelegene übergeordnete Element, das Sie abhören können, besser, und Sie können jedes Element anstelle von verwenden
document
, solange sich die untergeordneten Elemente, auf die Sie Ereignisse überwachen möchten, in diesem übergeordneten Element befinden ... aber das hat wirklich nichts zu tun mit der Frage.quelle
$(element).on(...)
. Das ist$(document).on(...,element,...)
. Verschiedene Tiere.Das Äquivalent von .live () in 1.7 sieht folgendermaßen aus:
Beobachten Sie das Dokument grundsätzlich auf Klickereignisse und filtern Sie sie nach #child.
quelle
.live()
ist)..live()
jetzt veraltet ist, ist, dass es schlecht ist, alle Live-Ereignishandler auf das Dokumentobjekt zu setzen. Die Dinge können sich wirklich sehr, sehr verlangsamen. Ereignisse müssen nicht nur bis zum Dokument sprudeln, sondern Sie müssen möglicherweise viele Ereignishandler für das Dokumentobjekt durchsehen. Der Hauptvorteil.on()
besteht darin, dass Sie es an ein übergeordnetes Objekt anhängen können, das viel näher am tatsächlichen Objekt liegt, und die Leistung drastisch verbessern können. Also ... Ich würde NICHT empfehlen,.on()
mit dem Dokumentobjekt zu verwenden. Es ist viel besser, ein näheres übergeordnetes Objekt auszuwählen..live()
Ansatz nach; Die Möglichkeit, die Delegierung zu steuern, ist jedoch sicherlich von Vorteil.Ich weiß, dass es etwas spät für eine Antwort ist, aber ich habe eine Polyfüllung für die .live () -Methode erstellt. Ich habe es in jQuery 1.11 getestet und es scheint ziemlich gut zu funktionieren. Ich weiß, dass wir die .on () -Methode wo immer möglich implementieren sollen, aber in großen Projekten, in denen es nicht möglich ist, alle .live () -Aufrufe aus irgendeinem Grund in die entsprechenden .on () -Aufrufe zu konvertieren, kann dies folgendermaßen sein Arbeit:
Fügen Sie es einfach hinzu, nachdem Sie jQuery geladen haben und bevor Sie live () aufrufen.
quelle
.on () ist für jQuery Version 1.7 und höher. Wenn Sie eine ältere Version haben, verwenden Sie diese:
quelle
.delegate()
eine viel bessere Leistung als.live()
das, weshalb das jQuery-Dokument dies empfiehlt und ablehnt.live()
. Ja,.live()
funktioniert immer noch, aber Antworten hier auf SO sollten die bessere Vorgehensweise empfehlen. Ich habe das 20 Mal hier auf SO gesehen. Wenn Sie.live()
hier auf SO eine Postleitzahl posten, wird diese herabgestuft (normalerweise nicht von mir, es sei denn, es stimmt etwas anderes nicht))..live()
definitiv auch in Version 1.7 funktioniert, sollten Sie es trotzdem verwenden.delegate()
oder.on()
weil.live()
es aus gutem Grund veraltet war. Solange Sie die Änderung der Syntax für die beiden neueren Funktionen beachten, funktioniert beides einwandfrei.Ich habe in meinem Projekt "live" verwendet, aber einer meiner Freunde schlug vor, "on" anstelle von "live" zu verwenden. Und als ich versuchte, das zu nutzen, hatte ich ein Problem wie Sie.
Auf meinen Seiten erstelle ich dynamisch Schaltflächen-Tabellenzeilen und viele Dom-Sachen. aber wenn ich die Magie benutze, verschwand sie.
Die anderen Lösungen wie "Verwenden Sie es wie ein Kind" rufen Ihre Funktionen jedes Mal bei jedem Klick auf. Aber ich finde einen Weg, es wieder möglich zu machen und hier ist die Lösung.
Schreiben Sie Ihren Code als:
Anrufer anrufen (); nachdem Sie Ihr Objekt auf der Seite wie folgt erstellt haben.
Auf diese Weise wird Ihre Funktion aufgerufen, wenn nicht jeder Klick auf die Seite erfolgen soll.
quelle