Ihre bestimmte Konvertierung in .on()
funktionierte nicht ordnungsgemäß, da Sie das statische Formular .on()
anstelle der dynamischen Form von .on()
verwendet haben.Anstelle der statischen Form:
$('.alert-link').on("click", function(){
müssen Sie die dynamische Form wie folgt verwenden:
$(someStaticParentObject).on("click", '.alert-link', function(){
Dies wird die Event-Handler someStaticParentObject
binden und dann delegierte Ereignis verwenden Umgang für alle untergeordneten Ereignisse, die ihren Ursprung auf einem Element, das dem Selektor '.alert-link'
entspricht. Ihre Version war sofort an alle Elemente gebunden, die zum Zeitpunkt der Installation des Ereignishandlers (statische Bindung) vorhanden waren, und verwendete keine delegierte Ereignisbehandlung, um Ereignisse von Objekten zu verarbeiten, die noch nicht erstellt wurden.
Sehen Sie diese bisherigen Antworten für eine gute Erklärung von .live()
vs. .on()
und warum .live()
zu Performance-Probleme in einigen Fällen führen kann:
Does jQuery.on() work for elements that are added after the event handler is created?
How does jQuery's new on() method compare to the live() method in performance?
What's the difference between jQuery.bind() and jQuery.on()?
jQuery .live() vs .on() method for adding a click event after loading dynamic html
Why not take Javascript event delegation to the extreme?
In Kürze:
$(".item").live('click', fn);
ist Funktionalität äquivalent zu:
$(document).on('click', '.item', fn);
Die zwei Hauptnachteile .live()
sind:
- Es wertet den Selektor
".item"
sofort welche ist reine Verschwendung von Zyklen, weil das Ergebnis überhaupt nicht verwendet wird.
.live()
ist fest mit dem Dokumentobjekt verbunden. Es verwendet die delegierte Ereignisbehandlung, um Objekte verarbeiten zu können, die kommen und gehen, aber alle Ereignishandler .live()
sind dem Dokumentobjekt zugewiesen. Wenn Sie viele davon haben, kann dies zu einem großen Leistungsengpass führen, da jedes Ereignis, das zum Dokument aufsteigt, mit den Selektoren aller Ereignisbehandlungsroutinen .live()
ausgewertet werden muss. .on()
kann andererseits nicht nur an das Dokumentobjekt gebunden werden, sondern auch an einen Vorfahren, der dem tatsächlichen Ursprung der Ereignisse viel näher ist, und wenn es viele delegierte Ereignishandler gibt, kann es viel effizienter zu finden sein Die Ereignisse werden näher, sodass nur die Ereignisse, die sich in der Nähe des Objekts befinden, über die .on()
Selektoren verarbeitet werden, wodurch die Leistung verbessert wird.
$("#container").on('click', '.item', fn);
wo #container
ist ein Elternteil der dynamischen .item
Objekte: Zum Beispiel könnten die oben Handler wie folgt durchgeführt werden.
Welche jQuery-Version verwenden Sie? – mowwwalker
Ich bin nicht ganz sicher, was Sie hier fragen bwhat ist Alert update ,? Kannst du dir etwas einfallen lassen, um uns ein Beispiel zu zeigen? – tkone
mögliches Duplikat von [Warum sollten Sie bei Verwendung von jQuery on() (Dokument) vs. dem Element selbst verwenden?] (Http: // stackoverflow.com/questions/9418991/wann-benutze-jquery-auf-warum-benutze-dokument-vs-das-element-selbst) – gdoron