Live () in jQuery in on () verwandeln

201

Meine Anwendung hat Dropdowns dynamisch hinzugefügt. Der Benutzer kann so viele hinzufügen, wie er benötigt.

Ich habe traditionell die live()Methode von jQuery verwendet, um festzustellen, wann eines dieser Dropdowns bearbeitet wurde change():

$('select[name^="income_type_"]').live('change', function() {
    alert($(this).val());
});

Ab jQuery 1.7 habe ich Folgendes aktualisiert:

$('select[name^="income_type_"]').on('change', function() {
    alert($(this).val());
});

Wenn Sie sich die Dokumente ansehen, sollte dies absolut gültig sein (richtig?) - aber der Ereignishandler wird niemals ausgelöst. Natürlich habe ich bestätigt, dass jQuery 1.7 geladen ist und ausgeführt wird usw. Das Fehlerprotokoll enthält keine Fehler.

Was mache ich falsch? Vielen Dank!

Jack
quelle
2
Ich weiß, dass dies zu spät ist, aber es scheint, dass jQuery livetatsächlich onsowieso verwendet wird, sodass ein erneutes Schreiben von Legacy-Code möglicherweise noch nicht erforderlich ist, bis livees entfernt wird, was meiner Meinung nach 1,9 ist. Auszug aus der Quelle 1.7.1: live: function( types, data, fn ) {jQuery( this.context ).on( types, this.selector, data, fn ); return this;}Wenn also kein Upgrade auf eine Version durchgeführt wird, in der keine Version mehr vorhanden liveist, ist möglicherweise kein sofortiges Update für Legacy-Code erforderlich. Für neuen Code außerhalb des Kurses wird on()stattdessen empfohlen. Ich dachte nur, diese Informationen könnten irgendwann jemand anderem helfen.
Nein,
1
Siehe Migration Beispiele auf , wie sie ändern livezu on.
Samuel Liew

Antworten:

246

In der onDokumentation heißt es (in Fettdruck;)):

Ereignishandler sind nur an die aktuell ausgewählten Elemente gebunden. Sie müssen zum Zeitpunkt des Aufrufs Ihres Codes auf der Seite vorhanden sein .on().

Äquivalent zu .live()wäre so etwas wie

$(document.body).on('change', 'select[name^="income_type_"]', function() {
    alert($(this).val());
});

Obwohl es besser ist, wenn Sie den Ereignishandler so nah wie möglich an die Elemente binden, dh an ein Element, das näher an der Hierarchie liegt.

Update: Bei der Beantwortung einer anderen Frage habe ich festgestellt, dass dies auch in der .liveDokumentation erwähnt wird :

Das Umschreiben der .live()Methode in Bezug auf ihre Nachfolger ist unkompliziert. Dies sind Vorlagen für äquivalente Aufrufe für alle drei Methoden zum Anhängen von Ereignissen:

$(selector).live(events, data, handler);                // jQuery 1.3+
$(document).delegate(selector, events, data, handler);  // jQuery 1.4.3+
$(document).on(events, selector, data, handler);        // jQuery 1.7+
Felix Kling
quelle
5
@ Jack: Keine Sorge, IMO ist es eine gute Frage. Ich nehme an anderen werden diese stolpern auch wenn sie versuchen , alle zu konvertieren bind, liveund delegateAnrufe on.
Felix Kling
4
Ah ja, und natürlich sehen wir diese Antwort erst, nachdem wir eine pauschale Suche und Ersetzung von .live>.on
ajbeaven
3
IMO ist die .onSyntax logischer, da der Listener tatsächlich an den von Ihnen bereitgestellten Selektor angehängt ist. Wenn das Ereignis ausgelöst wird, durchläuft jQuery das DOM und führt die angegebenen Handler aus (einfache Ereignisdelegierung). .liveschlug vor, dass etwas "Magisches" passiert ist, und es wurde gesagt, dass Event-Handler für "zukünftige Elemente" angehängt werden, was nicht ganz richtig war.
David Hellsing
1
@FelixKling das ist richtig - ich bin auch darauf gestoßen! Danke
willdanceforfun
2
Für die Suchmaschine: Die jQuery-Methode ".live ()" wird seit v1.7 abgeschrieben und in v1.9 entfernt. Korrigieren Sie Ihre Skripte, indem Sie stattdessen die Methode ".on ()" verwenden. Überraschenderweise wirkt sich dies auch auf die aktuelle Microsoft-Datei jquery.unobtrusive-ajax.js v2.0.20710.0 aus (Microsoft hat die Skripte auch nicht aktualisiert, sodass sie jetzt fehlerhaft sind).
Tony Wall
25

Zusätzlich zur ausgewählten Antwort

Port jQuery.liveauf jQuery 1.9+ , während Sie warten für Ihre Anwendung zu migrieren. Fügen Sie dies Ihrer JavaScript-Datei hinzu.

// Borrowed from jQuery 1.8.3's source code
jQuery.fn.extend({
  live: function( types, data, fn ) {
          if( window.console && console.warn ) {
           console.warn( "jQuery.live is deprecated. Use jQuery.on instead." );
          }

          jQuery( this.context ).on( types, this.selector, data, fn );
          return this;
        }
});

Hinweis: Die obige Funktion funktioniert in jQuery v3 nicht, da sie this.selectorentfernt wurde.

Sie können auch https://github.com/jquery/jquery-migrate verwenden

Vikrant Chaudhary
quelle
7

Ich habe gerade eine bessere Lösung gefunden, bei der kein Code von Drittanbietern bearbeitet wird:

https://github.com/jquery/jquery-migrate/#readme

Installieren Sie das jQuery Migrate NuGet-Paket in Visual Studio, damit alle Versionsprobleme behoben werden. Wenn Microsoft das nächste Mal seine unauffälligen AJAX- und Validierungsmodule aktualisiert, versuchen Sie es möglicherweise erneut ohne das Migrationsskript, um festzustellen, ob das Problem behoben wurde.

Da jQuery Migrate von der jQuery Foundation verwaltet wird, ist dies meines Erachtens nicht nur der beste Ansatz für Bibliotheken von Drittanbietern, sondern auch, um Warnmeldungen für Ihre eigenen Bibliotheken zu erhalten, in denen detailliert beschrieben wird, wie diese aktualisiert werden.

Tony Wall
quelle
3

Zusätzlich zu den ausgewählten Antworten

Wenn Sie Visual Studio verwenden , können Sie Regex Replace verwenden .
Unter Bearbeiten> Suchen und Ersetzen> In Dateien ersetzen
oder Strg + Umschalt + H.

Legen Sie im Popup-Fenster Suchen und Ersetzen diese Felder fest

Suchen nach: \$\((.*)\)\.live\((.*),
Ersetzen durch : Aktivieren Sie$(document.body).on($2,$1,
in den Suchoptionen "Reguläre Ausdrücke verwenden".

Maykol Rypka
quelle
-1

jquery verision xxxjs offener Editor, find jQuery.fn.extend

Code hinzufügen

live: function( types, data, fn ) {
        jQuery( this.context ).on( types, this.selector, data, fn );
        return this;
    },

Beispiel: jquery-2.1.1.js -> Zeile 7469 (jQuery.fn.extend)

Beispielbildansicht

Uğur Tosun
quelle