2009-03-03 4 views
2

ich ein Stück Code, der auf diese vereinfacht werden kann:IE schlägt fehl, wenn Funktionen von externem Javascript aufruft?

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) ; 

In allen Browsern außer IE, dies führt, wie man es erwarten würde - Funktionen von somehost.com/scripts/FooFunctions.js wie erwartet .

In Internet Explorer schlägt dies fehl.

Googeln scheint dies schwierig. Ich habe gelegentlich Post mit dem gleichen Problem gefunden, aber keine Lösung.

(Es gibt einen triftigen Grund, dass die externe Datei von Javascript enthalten sein muss auf diese Weise, und dass die PGAE ein <script src="http://somehost.com/scripts/FooFunctions.js"> darin eingefügt nicht haben kann.)

Um klar zu sein, die Frage ist: Wie kann ich das oben genannte Stück des Codes im Internet Explorer die gleiche Funktion wie in z Feuerfuchs?

Antwort

2

das Versuchen, es funktioniert in 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

Nicht ganz sicher, aber das funktioniert wahrscheinlich, weil Skript Aufnahme durch DOM-Injektion (was Sie hier tun), Skriptdownloads nicht parallelisiert - sie werden seriell geladen. Daher ist garantiert, dass es verfügbar ist, wenn Sie die Warnung erreichen(). –

+0

Ich habe eigentlich schon diese Methode ausprobiert, und es schien nicht das Problem zu lösen, aber ich werde es erneut versuchen. – mozboz

0

Es sieht aus wie IE FooFunction Aufruf, bevor das Skript geladen wird. Sie können dies testen, indem Sie setTimeout("FooFunction(42, 'i love cats')", 1000); verwenden, vorausgesetzt, dass eine Sekunde genug Zeit für das Laden des Skripts ist, wird dieser Aufruf erfolgreich sein.

Wenn Sie kein Framework wie jQuery verwenden können, die Skripte zu laden, die Sie mit einem Rückruf, wenn die Skript Lasten liefert, könnten Sie in der Lage sein, eigene zu hacken mit setInterval, die Überprüfung für FooFunction

+0

In IE können Sie dem Script-Tag einen onreadystatechange-Handler (ähnlich AJAX) hinzufügen, um zu wissen, wann es geladen wurde. – some

0

Wie Sobald der Aufruf von document.write abgeschlossen ist, wird die Funktion im zweiten Skript-Tag ausgeführt. Unabhängig davon, ob das externe Skript bereits geladen wurde oder nicht. Dies sollte nicht nur ein IE-Problem sein, sondern sollte alle Browser betreffen. Sind Sie sicher, dass andere Browser nicht betroffen sind, da sie das externe Skript zwischengespeichert haben? Was passiert, wenn Sie Ihren Cache leeren und es erneut in einem anderen Browser versuchen? In einer idealen Welt sollten Sie nur .onload auf dem Skript-Tag verwenden können, aber ich bin zu 99% sicher, dass es Probleme gibt, dass onload nicht auf Skript-Tags in IE6 feuert, also müssen wir darauf zurückgreifen Laden Sie stattdessen das Fensterelement auf. Dieses Event wird erst ausgelöst, wenn alle Skripte einschließlich der oben genannten externen js-Dateien heruntergeladen wurden.

Verwandte Themen