2010-08-01 4 views
3

J'essaye de charger des javascripts paresseux, mais je n'arrive pas à le faire fonctionner de manière fiable. Mes pages se chargent assez rapidement et je veux le garder ainsi, donc je ne suis pas sur le point d'utiliser un timeout pour retarder le chargement. En plus de document.readyState, comment puis-je m'assurer que le DOM est vraiment prêt à être modifié?Au début appendChild enfer dans les 3 premiers navigateurs

Méthode I:

  1. sondage readyState

  2. script createElement

  3. src = url

  4. AppendElement à la tête

Résultats:

IE8: avorte toujours

FF3: charges première fois, avorte tous les autres

Chrome: charges première fois, avorte chaque autre

Méthode II: (lazyload inclus dans tag publicitaire)

  1. de charge avec lazyload

Résultats:

IE8: toujours arrête prématurément

FF3: fonctionne

Chrome: charges première fois, avorte tous les autres

+1

Vous allez probablement besoin de montrer du code. –

+0

Vous pourriez vouloir regarder [ici] (http://stackoverflow.com/questions/2804212/dynamic-script-addition-should-be-ordered) – sje397

+0

Je pense que Peter Michaux '[Le problème window.onload (Still)] (http://peter.michaux.ca/articles/the-window-onload-problem-still) pourrait être une bonne lecture. –

Répondre

1

Javascript est multi-navigateurs difficilement utilisable sans un cadre décent pour vous aider à couvrir la différence. Probablement le plus populaire aujourd'hui est jquery, où, par this tutorial, vous pouvez utiliser $(document).ready(). En dojo, également très populaire, vous pouvez utiliser addOnLoad. Et ainsi de suite ... et si vous n'utilisez aucun framework, vous rendez la vie trop dure pour vous: faites-vous plaisir et choisissez un framework JS qui vous plait! -)

+2

"Difficilement utilisable" est un peu fort. –

+0

@Tim, c'est fort, mais cela reflète pleinement mes sentiments et mon expérience: pour que le JS inter-navigateurs fonctionne correctement, la seule alternative - faire votre propre agent d'utilisateur reniflant et bogues de navigateur - contourne votre travail orienté application, manque toujours un coin de cas ou autre, continue à frapper de nouvelles versions du navigateur avec quelques corrections et de nouveaux bugs - l'utilisation de "enfer" dans le sujet Q est en fait un peu plus fort que mon "hardy" (certains s'y opposeraient jurant! -) mais aussi parfaitement approprié et précis (comme c'est maudissant, à mon humble avis, quand il est confronté à un tel gâchis ;-). –

+0

Merci pour votre contribution Alex, mais mon problème est en fait avec le chargement des cadres! Dans l'intérêt de la portabilité du serveur, l'idée est de charger des bibliothèques basées sur des informations dynamiques disponibles du côté client. Je me rends compte que je suis peut-être en train d'investir trop de confiance dans les dépendances satellites qui existent toujours, etc ... c'est devenu une de ces choses que je dois savoir d'une façon ou d'une autre; Est-ce viable? Il devrait être, et donc je le poursuis! :-) –

2

Si vous mettez votre tag <script> juste au-dessus de la balise </body>, vous pouvez faire la plupart des choses avec DOM sans que cela ne provoque d'erreurs, c'est-à-dire que tout ce qui est au-dessus de la balise <script> est habituellement disponible pour modification.

Cependant, si vous êtes à la recherche d'une solution plus robuste, vous pourriez avoir des progrès en vérifiant comment les grandes bibliothèques sont détecter si le DOM est prêt, voici un pour les débutants (jQuery): http://github.com/jquery/jquery/blob/master/src/core.js#L393

+0

ou utilisez l'événement 'window.onload'. – Sarfraz

+1

Oui, mais l'événement 'window.onload' attend après que toutes les images (et autres ressources) ont été téléchargées, ce n'est souvent pas ce que vous voulez car cela prendrait plus de temps que nécessaire, et pourrait diminuer l'expérience de l'utilisateur. – peol

+0

Je ne peux pas le faire coller. Les navigateurs, semble-t-il, rapportent que le DOM est prêt un peu plus tôt qu'il ne l'est en réalité. 'appendChild' trop tôt après que le DOM soit' prêt' et il écrase juste le noeud que j'ajoute. Dans IE8 par exemple, il écrase la tête et perd le corps tout à fait. Je modère les travaux de timeout. Mais alors la question est combien de temps est trop long - et combien de temps n'est pas assez long? Il semble que la fonctionnalité que je pensais devoir être mise en place jusqu'à ce que quelque chose se présente ... –

Questions connexes