2013-01-23 13 views
8

Mein Web-Framework aktualisiert automatisch mein jQuery-Skript auf die aktuelle letzte Version, die 1.9.Wie "Live" von jQuery 1.8.3 zu jQuery 1.9 zu ersetzen?

Jetzt alle meine:

$(".myclass").live("click", function() {... 

funktionieren nicht mehr. Ich habe es meistens mit etwas Ajax benutzt, das html in meine Seite gefüllt hat.

Ich würde wissen, wie man diese Funktionalitaet in der letzten Version ersetzt. Ein Freund sagte mir, ich solle stattdessen "on" verwenden, aber das "on" bleibt auf demselben Element fixiert.

Erklärung, in diesem Beispiel (kein Ajax) verwende ich ein "+" - Symbol, um eine "ul li list" anzuzeigen.

$(".closed").live('click', function(){ 
    $("#ul_list_"+$(this).attr('id')).addClass("displayed").removeClass("hidden").show(); 
    $(this).addClass("openned").removeClass('closed'); 
    $(this).html('<i class="icon-minus"></i>'); 
}); 

$(".openned").live('click', function(){ 
    $("#ul_list_"+$(this).attr('id')).addClass("hidden").removeClass("displayed").hide(); 
    $(this).addClass("closed").removeClass('openned'); 
    $(this).html('<i class="icon-plus"></i>'); 
}); 

(Ich weiß, dass das Skript ist nicht die jemals optimiert, aber es funktionierte. Benutzte ich Klassen meine Listen zu öffnen oder zu schließen. Und wenn der Besucher nicht JS aktiviert hat, nichts ist verborgen, alle die gefalteten Listen geöffnet)

Hinweise:

+0

Haben Sie versucht "binden"? –

+0

In der Tat suchte ich von 1.8 bis 1.9, oder einfach nur "jquery 1.9 live", ohne zu bemerken, dass es von 1.7 war! Vielen Dank! – Polopollo

+0

Siehe [Migrationsbeispiele] (http://stackoverflow.com/a/14354091/584192) –

Antwort

25

Die docs bereits ein Beispiel nennen ist veraltet:

Umschreiben der .live() -Methode in seinem Nachfolger ist unkompliziert; diese sind Vorlagen für gleichwertige Anrufe für alle drei Ereignisbefestigungsmethoden:

$(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+ 

Also: $(document).on("click", ".closed", function() { ... }).

+0

Die Docs haben auch eine wirklich gute Beschreibung der Funktionsweise des Selektors: "Wenn ein Selektor bereitgestellt wird, wird der Event-Handler als delegiert bezeichnet. Der Handler wird nicht aufgerufen, wenn das Ereignis direkt auf dem gebundenen Element auftritt, sondern nur Nachkommen (innere Elemente), die mit dem Selektor übereinstimmen jQuery bubbelt das Ereignis vom Ereignisziel bis zum Element, an das der Handler angefügt ist (dh innerstes Element zum äußersten Element) und führt den Handler für alle Elemente auf diesem Pfad aus, die dem Selektor entsprechen." –

+0

In der Tat, ich habe die Beispiele der neuen" on "-Dokumentation gelesen ... Ich habe nicht über die" Live "-Dokumentation nachgedacht ... Danke! – Polopollo

+0

.on funktioniert nicht wie .Live, denke ich Jquery denke hat mir nicht wirklich etwas gegeben, das es ersetzen könnte .Live war sehr praktisch – sam360

1

müssen Sie die on statt live verwenden. weil live auf der Version 1.7

+1

Dies ist nicht richtig. $ (". closed") enthält nur Elemente, die beim Ausführen dieses Codes übereinstimmen, nicht Elemente, die später als geschlossen markiert werden. Der Punkt des Lebens war, dass die Abfrage "live" war. –

7

Sie müssen on mit einem delegierten Handler verwenden:

$('#parent').on('click', '.closed', function() { 
    // your code... 
}); 

Beachten Sie, dass #parent mit dem nächsten übergeordneten Elemente zu .closed ersetzen sollten, die beim Laden der Seite verfügbar sind - in der Regel das Element, die .closed beigefügtem wurde.