2009-01-21 9 views
11

J'ai rencontré ce qui ressemble à un problème d'oeuf de poulet et j'ai ce que je pense est une solution logique. Cependant, il m'est venu à l'esprit que d'autres devaient avoir rencontré quelque chose de similaire, alors j'ai pensé que je le ferais flotter pour les masses.Dojo addOnLoad, mais Dojo est-il chargé?

La situation est que je veux utiliser la fonction addOnLoad de dojo pour mettre en file d'attente un certain nombre de callbacks qui devraient être exécutés après que le DOM ait terminé le rendu côté client. Donc ce que je fais est la suivante:

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

Maintenant, la question est que je semble appeler dojo.addOnLoad avant toute la bibliothèque Dojo a été téléchargé le navigateur. Cela est logique dans un sens, car le contenu SCRIPT en ligne doit être exécuté avant que le DOM entier soit chargé (et le rappel normal de la fonction onload est déclenché). Ma question est la suivante: est-ce que mon approche est correcte, ou cela aurait-il plus de sens d'enregistrer un rappel JavaScript normal/standard pour charger une fonction, qui fait le même travail que chacun des dojo.addOnLoads le bloc SCRIPT. Bien sûr, cela soulève la question, pourquoi utiliseriez-vous alors dojo.addOnLoad si vous n'êtes pas sûr que la bibliothèque Dojo sera chargée avant d'utiliser la bibliothèque?

Espérons que cette situation a du sens pour quelqu'un d'autre que moi. On dirait que quelqu'un d'autre a peut-être rencontré cette situation.

Pensées?

Cordialement, Adam riz

Répondre

12

Vous le faites correctement. Les fichiers Javascript externes sont chargés et exécutés de manière synchrone dans l'ordre, donc au moment où il atteint votre dojo.addOnLoad(...); Dojo a chargé. Utilisez dojo.addOnLoad au lieu de window.onload pour deux raisons:

  • il se déclenche plus tôt, car il utilise DOMContentLoaded
  • il gère le chargement asynchrone des dojo.require en reportant l'exécution jusqu'à ce que tous les scripts nécessaires ont été lus

Expliqué en tant DojoCampus (dojo.addOnLoad):

dojo.addOnLoad est af aspect fondamental d'utiliser Dojo. Passer addOnLoad une fonction enregistrera la fonction à exécuter lorsque le Dom est prêt. Ce diffère légèrement de document.ready et body.onload dans ce addOnLoad attend jusqu'à ce que tout dojo.require() (et leurs dépendances récursives) ont chargé avant de tirer.

-5

Cela n'a peut-être rien à voir avec votre problème, mais j'ai juste eu un cas où j'avais les mêmes symptômes. Pour moi tout a bien fonctionné pour Firefox, Chrome etc, mais pas IE8. Je recevais ce qui ressemblait à un dojo non chargé, une erreur dans IE8 disant que dojo n'était pas défini (mais pas tout le temps) et je pouvais tout décomposer en feuilles de style et importer dojo tout en obtenant l'erreur.Je dirigeais un serveur de développement de moteur d'application google local. Cela semble être basé sur pythons SimpleHTTPServer qui à son tour utilise SocketServer.BaseServer. Cela a BaseServer.request_queue_size qui par défaut 5 - je ne pouvais pas trouver quelque chose dans le moteur de l'application qui a outrepassé cette valeur, donc je suppose que le développement du moteur google app engine a une limite supérieure de 5 connexions.

En utilisant regedit et allez à HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings

« MaxConnectionsPerServer » = dword: 00000010 « MaxConnectionsPer1_0Server » = dword: 0000010

Cela montre que IE allait pour essayer d'ouvrir jusqu'à 10 connexions simultanées. J'ai édité ces deux clés et les fait 2 et ai redémarré l'ordinateur, le problème est parti.

+0

Sans objet ici. –