Wie rufe ich eine Funktion auf, nachdem jQuery .append
vollständig abgeschlossen ist?
Hier ist ein Beispiel:
$("#root").append(child, function(){
// Action after append is completly done
});
Das Problem: Wenn eine komplexe DOM-Struktur angehängt wird, ist die Berechnung der neuen Größe des Stammelements innerhalb des Rückrufs der Anhängefunktion falsch. Es wird davon ausgegangen, dass das DOM noch nicht vollständig geladen ist, sondern nur das erste untergeordnete Element des hinzugefügten komplexen DOM.
append()
dauert sehr wenig Zeit.Antworten:
Sie haben hier viele gültige Antworten, aber keine davon sagt Ihnen wirklich, warum es so funktioniert.
In JavaScript werden Befehle einzeln synchron in der Reihenfolge ausgeführt, in der sie kommen, es sei denn, Sie weisen sie ausdrücklich an, mithilfe eines Timeouts oder Intervalls asynchron zu sein.
Dies bedeutet, dass Ihre
.append
Methode ausgeführt wird und nichts anderes (ohne Berücksichtigung möglicher Zeitüberschreitungen oder Intervalle) ausgeführt wird, bis diese Methode ihren Job beendet hat.Zusammenfassend ist kein Rückruf erforderlich, da er
.append
synchron ausgeführt wird.quelle
Nun, ich habe genau das gleiche Problem mit der Größenberechnung und nach stundenlangen Kopfschmerzen muss ich nicht damit einverstanden sein, mich
.append()
streng synchron zu verhalten. Na zumindest in Google Chrome. Siehe folgenden Code.Die Eigenschaft padding-left wird in Firefox korrekt abgerufen, ist jedoch in Chrome leer. Wie alle anderen CSS-Eigenschaften nehme ich an. Nach einigen Experimenten musste ich
setTimeout()
mich damit zufrieden geben, den CSS-Getter mit einer Verzögerung von 10 ms einzupacken, von der ich weiß, dass sie höllisch hässlich ist, aber die einzige, die in Chrome funktioniert. Wenn einer von Ihnen eine Idee hätte, wie man dieses Problem besser lösen könnte, wäre ich sehr dankbar.quelle
.ready()
viel bessere und elegantere Lösung verwendet.Obwohl Marcus Ekwall in Bezug auf die Synchronität des Anhängens absolut Recht hat, habe ich auch festgestellt, dass in seltsamen Situationen das DOM manchmal nicht vollständig vom Browser gerendert wird, wenn die nächste Codezeile ausgeführt wird.
In diesem Szenario sind die Shadowdiver-Lösungen - mit .ready - in der richtigen Richtung. Es ist jedoch viel aufgeräumter, den Aufruf an Ihren ursprünglichen Anhang zu ketten.
quelle
Ich bin überrascht über alle Antworten hier ...
Versuche dies:
Beachten Sie das 0-Timeout. Es ist keine willkürliche Zahl ... wie ich verstehe (obwohl mein Verständnis etwas wackelig sein mag), gibt es zwei Javascript-Ereigniswarteschlangen - eine für Makroereignisse und eine für Mikroereignisse. Die Warteschlange mit "größerem" Gültigkeitsbereich enthält Aufgaben, die die Benutzeroberfläche (und das DOM) aktualisieren, während die Mikrowarteschlange Operationen vom Typ "Schnelle Aufgaben" ausführt.
Beachten Sie auch, dass das Festlegen eines Zeitlimits nicht garantiert, dass der Code genau den angegebenen Wert aufweist. Dadurch wird die Funktion im Wesentlichen in die höhere Warteschlange (die die Benutzeroberfläche / das DOM verwaltet) gestellt und nicht vor der angegebenen Zeit ausgeführt.
Dies bedeutet, dass durch das Festlegen eines Zeitlimits von 0 es in den UI / DOM-Teil der Ereigniswarteschlange von Javascript verschoben wird, um bei der nächstmöglichen Gelegenheit ausgeführt zu werden.
Dies bedeutet, dass das DOM mit allen vorherigen Warteschlangenelementen (z. B. eingefügt über) aktualisiert wird
$.append(...);
, und wenn Ihr Code ausgeführt wird, ist das DOM vollständig verfügbar.(ps - Ich habe dies von Secrects of the JavaScript Ninja gelernt - ein ausgezeichnetes Buch: https://www.manning.com/books/secrets-of-the-javascript-ninja )
quelle
setTimeout()
ohne zu wissen warum. Danke für die Erklärung!Ich habe eine andere Variante, die für jemanden nützlich sein kann:
quelle
...on('load', function(){ ...
hier verwenden: stackoverflow.com/a/37751413/2008111Ich bin auf dasselbe Problem gestoßen und habe eine einfache Lösung gefunden. Fügen Sie nach dem Aufrufen der Append-Funktion ein bereites Dokument hinzu.
quelle
Die Verwendung
MutationObserver
kann wie ein Rückruf für die jQuery-append
Methode wirken:Ich habe es in einer anderen Frage erklärt , und dieses Mal werde ich nur ein Beispiel für moderne Browser geben:
quelle
Ich denke, dies ist gut beantwortet, aber dies ist etwas spezifischer für die Behandlung von "subChild_with_SIZE" (wenn dies vom übergeordneten Element kommt, aber Sie können es von dort aus anpassen, wo es sich befindet).
quelle
$.when($('#root').append(child)).then(anotherMethod());
quelle
$.when
funktioniert nur für diejenigen Objekte, deren Rückgabe ein Versprechen ObjektanotherMethod()
sofort aufrufen . Es wird nicht als Rückruf übergeben.Die Jquery-Append-Funktion gibt ein jQuery-Objekt zurück, sodass Sie am Ende einfach eine Methode markieren können
quelle
Für Bilder und andere Quellen können Sie Folgendes verwenden:
quelle
Am saubersten ist es, es Schritt für Schritt zu tun. Verwenden Sie jede Funktion, um durch jedes Element zu iterieren. Sobald dieses Element angehängt ist, übergeben Sie es an eine nachfolgende Funktion, um dieses Element zu verarbeiten.
quelle
Dieses Problem ist beim Codieren von HTML5 für mobile Geräte aufgetreten. Einige Browser- / Gerätekombinationen verursachten Fehler, da die Methode .append () die Änderungen im DOM nicht sofort widerspiegelte (was dazu führte, dass der JS fehlschlug).
Eine schnelle und schmutzige Lösung für diese Situation war:
quelle
Ja, Sie können jeder DOM-Einfügung eine Rückruffunktion hinzufügen :
$myDiv.append( function(index_myDiv, HTML_myDiv){ //.... return child })
Überprüfen Sie die JQuery-Dokumentation: http://api.jquery.com/append/
Und hier ist ein praktisches, ähnliches Beispiel: http://www.w3schools.com/jquery/ tryit.asp? filename = tryjquery_html_prepend_func
quelle
.prepend()
Methode durch Folgendes ersetzen : $ ("p"). Prepend (Funktion (n, pHTML) {return "<b> Dieses p-Element </ b> (\" <i > "+ pHTML +" </ i> \ ") <b> hat den Index" + n + "</ b>."Ich bin kürzlich auf ein ähnliches Problem gestoßen. Die Lösung für mich war, die Sammlung neu zu erstellen. Lassen Sie mich versuchen zu demonstrieren:
Hoffe das hilft!
quelle
In jquery können Sie direkt nach dem Anhängen verwenden
$ () ruft eine Funktion auf, die entweder einen DOM-fähigen Rückruf registriert (wenn eine Funktion an sie übergeben wird) oder Elemente aus dem DOM zurückgibt (wenn eine Auswahlzeichenfolge oder ein Element an sie übergeben wird).
Weitere
Unterschiede zwischen $ und $ () finden Sie hier in jQuery
http://api.jquery.com/ready/
quelle
Ich weiß, dass es nicht die beste Lösung ist, aber die beste Vorgehensweise:
quelle
Anhängen hat keine Rückrufe, und dies ist Code, der synchron ausgeführt wird - es besteht kein Risiko, dass er NICHT ausgeführt wird
quelle
quelle