2013-03-11 15 views
6

Was sollte der richtige Ersatz für die jQuery.live() sein. Ich weiß, dass jQuery.on() dasselbe tut, aber im Fall von jQuery.on() müssen wir das übergeordnete Element angeben, damit es funktioniert.Was ist der Ersatz für jQuery.live

Angenommen, ich habe 500 live auf meiner Seite und jetzt möchte ich alle 500 live zu ändern und es durch die Auswahl der Eltern jedes Elements wäre nicht machbar und würde mehr Zeit brauchen.

Angenommen, ich habe $(".item").live("click",function(){ alert("test"); });

und wenn ich es durch jQuery.on replace() dann sollte es $("body").on("click",".item",function(){ alert("test"); });

sein, aber ich frage mich, ob es eine Verknüpfung Weg oder irgendetwas anderes ist dies wie folgt

zu erreichen
$(".item").on("click",function(){ alert("test"); }); 

so dass ich alle in wenigen Sekunden ersetzen kann.

+0

Eine schnelle und schmutzige Lösung wäre ein 3-Zeilen-Plugin, um eine Live-Funktion basierend auf "on" zu halten. –

+0

@dystroy - Das dachte ich auch –

+0

Gibt es nicht etwas, so dass ich keine Plugins verwenden muss? –

Antwort

4

.live() ist tot, lang .live() leben: https://github.com/jquery/jquery/commit/eed78cc321ed7e2b37fb34e32fbb528b24f61d6e

Obwohl ernst, für die Einzeiler Sie suchen, können Sie es einfach wieder hinzufügen:

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

dass der nach oben hin hinzufügen JS, um effektiv eine Unterlegscheibe zu erstellen, mit der Sie .live() verwenden können, wie Sie wollen, und sich nicht darum kümmern, welche Version von jQuery Sie verwenden.

Aber wirklich, wie andere sagen, sollten Sie einfach einen find-replaceall mit dem Texteditor Ihrer Wahl oder ein Befehlszeilenprogramm wie sed tun. In der Shim-Lösung, die ich Ihnen gebe, rufen Sie eine Funktion auf, um eine andere Funktion aufzurufen, die viel Overhead verursacht und möglicherweise eine unnötige Menge an Ressourcen verbraucht. .on() ist viel effizienter, vor allem, wenn Sie es direkt anrufen.


aktualisieren: Die obige Lösung basiert auf jQuery internen .context Eigenschaft, die has been deprecated seit jQuery 1.10 und in einer späteren Version verschwinden. Eine alternative Version, die Ihre Bedürfnisse erfüllen sollte die meiste Zeit wäre einfach zu ersetzen this.context mit document. Dies hat Einschränkungen in den .context property's API umrissen:

Der Wert dieser Eigenschaft ist in der Regel gleich zu dokumentieren, da dies ist der Standardkontext für jQuery Objekte, wenn kein zugeführt wird. Der Kontext kann abweichen, wenn das Objekt beispielsweise von in einem oder XML-Dokument erstellt wurde.

So kann es fehlschlagen. Wie auch immer, jetzt haben Sie definitiv keine Entschuldigung mehr, .on() nicht direkt zu verwenden. Fühlen Sie sich frei zu überprüfen my tips on upgrading to the most recent version of jQuery.

3

Sie könnten ein kleines Plugin definieren, das Ihnen die alte live Funktion gibt, indem Sie on aufrufen, aber das würde Sie nur mit einem schlechteren Code lassen. Sie benötigen, um Ihren Code zu refurbizieren, um on richtig zu verwenden.

Eine Lösung, die Ihnen hilft, die anfängliche Änderung ein wenig einfacher zu verwalten, wäre, eine Regex zu verwenden, um den Austausch durchzuführen. Die meisten Texteditoren können Ihnen das erlauben.

Für die Verwendung Fall, dass Sie geben, können Sie diese verwenden (zB in JavaScript, passen für Ihren Editor):

var output = input.replace(
     /\$\(\"([^\"]+)\"\)\.live\(\"([^\"]+)\"/g, 
     '$(document.body).on("$2", "$1"' 
); 

Eingang:

$(".item").live("click",function(){ alert("test"); }); 
$(".item2").live("change",function(){ console.log("test"); }); 

Ausgang:

$(document.body).on("click", ".item",function(){ alert("test"); }); 
$(document.body).on("change", ".item2",function(){ window.top.console.log("test"); }); 

Nach Bei dieser ersten Transformation müssen Sie nach besseren übergeordneten Elementen als document.body suchen.

+0

Dafür muss ich es für jedes Element tun.Ich suche eine einfache Ein-Zeilen-Lösung. –

+0

Nein: Ihr Editor kann eine Regex auf eine ganze Datei anwenden, genauso wie mein kleiner Js-Code auf eine ganze Datei angewendet werden kann. –

2

Ähnlich @ zerstören Antwort - etwas anderes zu versuchen - nach Dateien sichern

Ich habe Komodo nicht aber gelungen, die folgenden für den Editor zu entwickeln ++:

Finden

\$\("(.+)"\).live\("(.+)", 

Ersetzen mit

$(document).on('\2', '\1', 

Regex-Syntaxen variieren, so dass Sie möglicherweise daran arbeiten müssen.

Sie müssen möglicherweise auch mehrere Varianten der Regex anpassen oder ausführen, um z. B. einzelne oder doppelte Anführungszeichen oder Leerzeichen zu berücksichtigen.

Verwandte Themen