2009-03-03 9 views
2

J'ai un morceau de code qui peut être simplifié à ceci:IE échoue, lors de l'appel des fonctions de javascript externe?

var s='' ; 

s += "<"+"script type=\"text/javascript\" src=\"http://somehost.com/scripts/FooFunctions.js\">\n"; 
s += "<"+"/script>" ; 
s += "<"+"script type=\"text/javascript\">\n"; 
s += "FooFunction(42, 'i love cats');\n"; 
s += "<"+"/script>" ; 

document.write(s) ; 

Dans tous les navigateurs sauf IE, ce que vous exécute attendez - fonctions de travail somehost.com/scripts/FooFunctions.js comme prévu .

Dans Internet Explorer, cela échoue.

Googling cela semble difficile. J'ai trouvé le poste occasionnel avec le même problème, mais pas de solution.

(Il y a une raison valable que le fichier externe doit être inclus de javascript cette façon, et que le AMPe ne peut pas avoir un <script src="http://somehost.com/scripts/FooFunctions.js"> inséré dedans.)

Pour être clair, la question est: Comment puis-je faire fonctionner le morceau de code ci-dessus dans Internet Explorer comme dans FireFox?

Répondre

2

Essayez ceci, cela fonctionne dans IE


function addJsFile(jsFileLocation){ 
    var script=document.createElement('script'); 
    script.type='text/javascript'; 
    script.src=jsFileLocation; 
    document.getElementsByTagName("head")[0].appendChild(script); 
} 
addJsFile("http://code.jquery.com/jquery-latest.pack.js"); 
setTimeout(function(){alert(jQuery);},1000); 
+0

Pas tout à fait sûr, mais cela fonctionne probablement parce que l'inclusion de script par l'injection DOM (ce que vous faites ici), ne parallélise pas les téléchargements de script - ils sont chargés en série. Par conséquent, il est garanti qu'il est disponible lorsque vous atteignez l'alerte(); –

+0

En fait, j'ai déjà essayé cette méthode, et il ne semble pas pour résoudre le problème, mais je vais essayer à nouveau. – mozboz

0

On dirait que IE appelle FooFunction avant que le script est chargé. Vous pouvez tester cela en utilisant setTimeout("FooFunction(42, 'i love cats')", 1000); en supposant qu'une seconde est suffisante pour que le script se charge, cet appel aboutira.

Si vous ne pouvez pas utiliser un framework comme jQuery pour charger les scripts, qui vous fournira un rappel lors du chargement de script, vous pourriez être en mesure de pirater votre propre avec setInterval, la vérification de FooFunction

+0

Dans IE, vous pouvez ajouter un gestionnaire onreadystatechange (similaire à AJAX) à la balise de script pour savoir quand elle a été chargée. – some

0

Comme Dès que l'appel document.write est terminé, la fonction est exécutée dans la deuxième balise de script. Indépendamment du fait que le script externe a déjà été chargé ou non. Cela ne devrait pas être juste un problème IE mais devrait affecter tous les navigateurs. Êtes-vous sûr que cela n'affecte pas les autres navigateurs car ils ont le script externe mis en cache? Que se passe-t-il lorsque vous effacez votre cache et réessayez dans un autre navigateur? De toute façon, dans un monde idéal, vous devriez pouvoir utiliser .onload sur le tag de script mais je suis sûr à 99% qu'il y a des problèmes avec l'onload qui ne se déclenche pas sur les tags de script dans IE6, donc nous devons recourir à Onload sur l'élément de la fenêtre à la place. Cet événement ne se déclenchera pas tant que tous les scripts n'auront pas été téléchargés, y compris les fichiers js externes comme ci-dessus.

Questions connexes