2010-12-17 18 views
2

Ich habe eine externe JavaScript-Bibliothek, um einige formatierte Inhalte zu generieren. Nennen wir es ExternalLibrary.GenerateGutterDivs()Wird das DOM sofort mit jQuery aktualisiert?

Dieser Code erzeugt eine Tabellenstruktur mit einigen divs, so etwas wie:

<table> 
    <tr> 
    <td class="gutter"> 
     <div>1</div> 
     <div>2</div> 
     <div>3</div> 
     ... 
    </td> 
    <tr> 
</table> 

Sobald die Tabelle erzeugen war, ich die erzeugte DOM-Objekte manipulieren wollen, wie folgt:

<script type="text/javascript"> 
    ExternalLibrary.generateGutterDivs(); 

    alert("shomething"); //if I comment this I don't see the second alert 

    $("td.gutter > div").each(function(index, val) 
    { 
     alert("gutterfound"); 
    }); 
</script> 

Das Problem ist, dass, wenn ich die erste alert("something") entferne, sehe ich nicht die zweite Warnung. Dieses make denken über das DOM vielleicht ist nicht sofort aufgefrischt. Weißt du, warum ich diese Situation erlebe?

Danke in fortgeschrittenem.

+2

Side Kommentar: Sie sollte nicht sein [Tabellen für das Layout verwenden] (http://phrogz.net/CSS/WhyTablesAreBadForLayout .html). – Phrogz

+0

Ihre Vermutung mag stimmen, aber ich glaube nicht, dass es so ist. Anstatt andere zu Rate zu ziehen, besteht der beste Weg zur Lösung Ihres Problems darin, einen abgespeckten Testfall zu erstellen. Löschen Sie alle HTML-, CSS- und JS-Dateien, die das Problem nicht beeinflussen. Dann tu es wieder und wieder, bis du wirklich, _really_ KEINEN überflüssigen Code hast, um das Problem zu verwirren. Wenn Sie diesen Code an andere weitergeben, können sie Ihr Problem schnell reproduzieren, Ihnen helfen, die Ursache zu verstehen, und Ihnen eine Lösung anbieten. _ (Und oft, im Prozess der Verringerung des Problems, werden Sie das Problem selbst herausfinden.) _ – Phrogz

+3

Und erstellen Sie eine jsfiddle :) Aber im schlimmsten Fall: Lassen Sie 'generateGutterDivs' einen Rückruf akzeptieren (obwohl jetzt, dass ich denke darüber nach, dies könnte das Problem nicht lösen). –

Antwort

4

Dies ist ein häufiges Problem. Sie sollten einen Verweis auf die divs von MyCode.generateGutterDivs(), zum Beispiel zurückkommen:

MyCode.generateGutterDivs = function() { 
    var safeReference = $("<div>1</div><div>2</div><div>3</div>") 
     .appendTo("td.gutter"); 
    return safeReference; 
}; 

Dann:

<script type="text/javascript"> 
    var divs = MyCode.generateGutterDivs(); 

    divs.each(function(index, val) 
    { 
     alert("gutterfound"); // Should see 3 of these now 
    }); 
</script> 

Edit: Da die Bibliothek zu modifizieren für das Plakat ist keine Option, ich glaube, eine SetTimeout für 0 Millisekunden wird es tun, an den Browser wodurch man die Aktualisierung des DOM zu beenden:

<script type="text/javascript"> 
    MyCode.generateGutterDivs(); 

    setTimeout(function() { 
     divs.each(function(index, val) 
     { 
      alert("gutterfound"); // Should see 3 of these now 
     }); 
    }, 0); 
</script> 
+0

@ box0: Danke für Ihre Hilfe. Das Problem besteht darin, dass die Bibliothek extern ist. Ich habe meinen Beitrag bearbeitet. Danke trotzdem. –

+1

@Daniel, siehe meine Bearbeitung, vielleicht wird es für Sie arbeiten –

+1

dies funktioniert mit 100ms. Aber das scheint eine gefährliche Lösung zu sein. Ich werde eine Sicherheitszeit einschließen, aber ich mag diese Lösung nicht sehr. Gibt es eine andere Möglichkeit, das DOM zu aktualisieren?Ich meine, warum wird es nicht sofort aufgefrischt? Der Code ist synchron, so dass ich nicht viel verstehe, was passiert? –

1

MyCode.GenerateGutterDivs() hat die Generierung der DOM-Elemente nicht beendet, bevor das jQuery-Snippet ausgeführt wird. Sie müssen MyCode.GenerateGutterDivs() ändern, um eine Callback-Funktion, so etwas wie dies zu akzeptieren:

MyCode.GenerateGutterDivs(function() { 
    $("td.gutter > div").each(function(index, val) { 
     alert("gutterfound"); 
    }); 
}); 

//inside MyCode 
GenerateGutterDivs = function(callback) { 
    // Generate formatted content. 
    callback(); 
}; 

Hier ist ein Proof of Concept: http://jsfiddle.net/gnbNt/2/

+0

GenerateGutterDiv ist eine externe Bibliothek. Ich werde untersuchen, ob ich es ändern und unter MIT-Lizenz verteilen kann. Danke für Ihre Hilfe. –

+0

Dieser Callback hat den gleichen Effekt ... er wartet nicht, bis das DOM fertig ist. –

+0

Ich stimme nicht zu, ich mache das die ganze Zeit. – Stephen

Verwandte Themen