2009-05-21 3 views
2

Um es klar zu stellen: Ich frage nicht, wie Sie vorhandene Hooks auf neue DOM-Elemente setzen. Ich kenne die live() -Funktion und das alte LiveQuery-Plugin. Ich frage etwas anderes.Hook auf das Hinzufügen neuer DOM-Elemente mit jQuery (oder plain JS)

Was ich wissen möchte, ist, wie man sich an die eigentliche Erstellung neuer DOM-Elemente anknüpft. Der Grund, weshalb ich frage, ist, dass ich ein JS-Skript eines Drittanbieters erstelle, das keine Kontrolle über Skripte von Erstanbietern hat. Diese Skripts von Erstanbietern (die verschleiert sind) aktualisieren die Seite regelmäßig, indem sie neue DOM-Elemente hinzufügen. Ich möchte Code ausführen, nachdem diese Elemente hinzugefügt wurden.

Verwenden von $ ('...') .bind ('ajaxSuccess', function() .....) funktioniert für einige Ergänzungen, aber nicht alle von ihnen.

Antwort

1

Ich bin mir nicht sicher, warum Sie fragen, ob Sie über livequery wissen. Livequery können Sie in beliebige neue DOM-Elemente einhaken. Außerhalb davon ist das einzige, was ich weiß zu tun ist in den DOM-Methoden (wie appendChild etc ...)

Die live() -Funktion, die in jQuery integriert wurde, ist eigentlich nicht die vollständige Live-Abfrage-Implementierung. (Resig dachte, es war zu viel Funktionalität ohne Blasen der Codegröße bis zu weit integriert werden)

In Live(), was fehlt ist der folgende Typ Funktion:

$('*').livequery(function() { 
// do something 
}); 

verwenden, und es sollte irgendwelche Zusätze fangen.

+0

Können Sie darauf erweitern? Gibt es eine Live-Abfrage-Funktionalität, die über die neue Funktion 1.3 live() hinausgeht? – Pistos

+0

Aktualisiert mit einem Beispiel. – cgp

+0

live() erlaubt keine (noch) beliebigen Selektoren. Das ist die Hauptbeschränkung. Es gibt auch einige Lebenszyklusprobleme; Sie sind alle in den jquery 1.3 Release Notes. –

2

Wenn sie immer mit der document.createElement-Methode hinzugefügt werden, können Sie sie einfach ersetzen und das Tracking dort durchführen.

document.replacedCreateElement = document.createElement; 
document.createElement = function(tagName) { 
    this.replacedCreateElement(tagName); 
    //do your tracking 
} 
+0

Interessant! Ich wusste nicht, dass wir Core-Funktionen einfach aliasieren/überschreiben könnten. – Pistos

+1

Dies ist genau das, was Live-Abfrage tut. – cgp

+0

Wenn ich dies versuchte, schießen die Browser in CPU-Auslastung. Ich denke, es ist zu viel DOM spidering. – Pistos

1

Nun, ich mit diesem Paar ging, die auf den gewünschten DOM-Updates innerhalb von 20 Sekunden oder weniger zu schießen scheint:

$('#someid').bind('ajaxSuccess', function() { ... }); 
$('#someid').ajaxSuccess(function(e, r, s) { ... }); 

ich eher müsste nicht das Laden der Seite verlangsamen, indem je nach Live-Abfrage, und die ersetzte CreateElement-Lösung verprügelte die CPU.

Verwandte Themen