2009-01-21 13 views
11

Ich habe festgestellt, was scheint wie ein Huhn & Ei Problem, und habe, was ich denke, ist eine logische Lösung. Mir fiel jedoch ein, dass andere auf etwas Ähnliches gestoßen sein mussten, also dachte ich mir, ich würde es für die Massen veröffentlichen.Dojo addOnLoad, aber ist Dojo geladen?

Die Situation ist, dass ich Dojo addOnLoad Funktion verwenden möchte, um eine Reihe von Callbacks in Warteschlange, die ausgeführt werden soll, nachdem das DOM auf Client-Seite Rendering abgeschlossen hat. Also, was ich tun, ist wie folgt:

<html> 
    <head> 
     <script type="text/javascript" src="dojo.xd.js"></script> 
     ... 
    </head> 
    <body> 
     ... 
     <script type="text/javascript"> 
      dojo.addOnLoad(...); 
      dojo.addOnLoad(...); 
      ... 
     </script> 
    </body> 
</html> 

Nun ist das Problem, dass ich scheine dojo.addOnLoad zu rufen, bevor die gesamte Dojo-Bibliothek hat den Browser heruntergeladen. Dies ist in gewisser Weise sinnvoll, da der Inline-SCRIPT-Inhalt ausgeführt werden sollte, bevor das gesamte DOM geladen wird (und der normale Body-Onload-Callback ausgelöst wird).

Meine Frage ist das - ist mein Ansatz Sound, oder wäre es sinnvoller, einen normalen/Standard-Body-Onload-JavaScript-Callback zum Aufruf einer Funktion, die die gleiche Arbeit, die jede der dojo.addOnLoads macht in tun zu registrieren der SCRIPT-Block. Dies wirft natürlich die Frage auf, warum sollten Sie jemals dojo.addOnLoad verwenden, wenn Sie nicht sicher sind, dass die Dojo-Bibliothek geladen wird, bevor Sie die Bibliothek verwenden?

Hoffentlich macht diese Situation für jemanden anders als mich Sinn. Es scheint, als hätte jemand anderes diese Situation erlebt.

Gedanken?

Mit besten Grüßen, Adam Reis

Antwort

12

Sie es richtig tun. Externe Javascript-Dateien werden synchron geladen und in der Reihenfolge ausgeführt, bis die dojo.addOnLoad(...); Dojo geladen ist. Verwenden Sie dojo.addOnLoad statt window.onload aus zwei Gründen:

  • es früher feuert, weil es DOMContentLoaded nutzt
  • es Griffe asynchrone Laden von dojo.require durch die Ausführung aufzuschieben, bis alle erforderlichen Skripte gelesen wurden

Erklärt in DojoCampus as:

dojo.addOnLoad ist af unbedingter Aspekt der Verwendung von Dojo. Übergeben von addOnLoad eine Funktion registriert die Funktion laufen, wenn der Dom bereit ist. Diese unterscheidet sich leicht von document.ready und body.onload in dem addOnLoad wartet, bis alle dojo.require() (und ihre rekursiven Abhängigkeiten) vor dem Auslösen geladen haben.

-5

Dies könnte nichts mit Ihrem Problem zu tun haben, aber ich hatte gerade einen Fall, wo ich die gleichen Symptome hatte. Für mich lief alles gut für Firefox, Chrome usw., aber nicht IE8.

Ich bekam was wie Dojo nicht geladen wurde, ein Fehler in IE8 sagen, dass Dojo undefined war (aber nicht die ganze Zeit) und ich konnte alles abschneiden, nur Stylesheets und Dojo importieren und immer noch den Fehler.

Ich habe einen lokalen Google App Engine Development Server ausgeführt. Dies scheint auf Pythons SimpleHTTPServer basieren, die wiederum SocketServer.BaseServer verwendet. Dies hat BaseServer.request_queue_size, die standardmäßig auf 5 gesetzt ist - ich konnte nichts in der app engine finden, das diesen Wert überschreiben würde, also nehme ich an, dass der Entwicklungs-Google App-Engine-Server eine Obergrenze von 5 Verbindungen hat.

Mit regedit und gehen Sie zu HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ Currentversion \ Internet Settings

„MaxConnectionsPerServer“ = dword: 00000010 „MaxConnectionsPer1_0Server“ = dword: 0000010

Dies zeigt, dass IE gehen wurde Versuchen Sie, bis zu 10 gleichzeitige Verbindungen zu öffnen. Ich habe diese zwei Schlüssel bearbeitet und sie 2 gemacht und den Computer neu gestartet, das Problem ging weg.

+0

irrelevant hier. –