2010-02-11 9 views
9

Wir haben JavaScript, das ein Skript-Include in eine dynamische Ressource auf unserer Webseite schreibt, damit wir einige Informationen zwischen Seiten austauschen können, die von verschiedenen Servern stammen Cross-Site-Scripting-Einschränkungen.IE führt intermittierend keine dynamisch hinzugefügte Skriptdatei aus

Die Idee ist, dass der Browser die JavaScript-Datei anfordert, die von einer dynamischen Ressource auf der Serverseite bedient wird (die auch einige serverseitige Informationen in die Anfrage eingibt). Die JavaScript-Datei wird dann vom Browser ausgeführt, wenn sie der Seite hinzugefügt wird.

Wir haben ein Problem mit Internet Explorer festgestellt, bei dem das in der Antwort zurückgegebene JavaScript nicht zeitweise ausgeführt wird, wenn es der Seite hinzugefügt wird. Wenn ein Fiddler-HTTP-Trace bei Auftreten des Problems untersucht wird, wird das Skript erfolgreich an den Browser zurückgegeben.

Um dies zu testen, zuverlässiger, ich den Code geändert, den das Skript 1000 mal in einer Schleife, wie unten ausgeführt, fügt hinzu:

for (var i = 1; i <= 1000; i++) { 
    try { 
     var script = document.createElement("SCRIPT"); 
     script.src = serverHome + "/ajavascriptfile.js?token=" + token + "&num=" + i; 
     script.id = token; 
     document.getElementsByTagName("HEAD")[0].appendChild(script); 
    } catch (e) { 
     alert(e); 
    } 
} 

Das Skript von ajavascriptfile.js einfach einen Zähler auf meiner Seite zurückgegeben:

var output = document.getElementById("output"); 
output.innerHTML = parseInt(output.innerHTML) + 1; 

In diesem Test werden keine Ausnahmen abgefangen oder alarmiert.

Wenn dies richtig ausgeführt wird, sollte der Zähler auf 1000 (was es in Firefox tut). In IE6 sind es jedoch 900-950, IE7 etwa 995-998 und IE8 ist eine schockierende 750-800.

Hat jemand anderes festgestellt, dass Internet Explorer keine dynamisch eingeschlossenen Skripts ausführt? Wenn ja, wissen Sie, wie Sie dieses Problem umgehen können?

+0

Haben Sie zufällig eine '' auf der Seite? –

+0

Nein Ich habe kein auf der Seite. –

+0

Ich arbeite durch dieses Problem, aber ich bin mir nicht sicher, warum es falsch ist! – JustEngland

Antwort

0

Internet Explorer kann die Skriptdatei zwischenspeichern. Versuchen Sie, einige zusätzliche Entropie zum src Zugabe umfassen:

script.src = serverHome + "/ajavascriptfile.js?token=" + token + "&num=" + i + '&r=' + Math.random(); 
+0

Das '' & num = "+ i 'wird für jede Anfrage eindeutig sein, daher sollte das Caching kein Problem darstellen. Wenn ich das "" & num = "+ i" entferne, macht IE7 nur eine einzige Anfrage an den Server und der Zähler wird fast augenblicklich auf 1000 gesetzt. Beachten Sie außerdem, dass unter normalen Umständen (in denen dieses Problem zuerst aufgetreten ist) nur eine einzige Anforderung vorliegt. Ich beantrage es nur 1000 Mal, um es zuverlässiger zu reproduzieren. –

+0

In Produktionssystemen kann das Caching immer noch ein Problem sein - das heißt, sind die Skript-URLs jedes Mal, wenn sie in einer Produktionsumgebung angefordert werden, eindeutig? In beiden Fällen (sei es in einer Testschleife oder in der Produktion) ist das IE-Verhalten unerwartet/unterbrochen. – leepowers

+0

@James: IE kann immer noch mit der & num-Seite zwischenspeichern, je nachdem, wie oft Sie dieselbe URL während Ihrer Tests angefordert haben. Wie Pygorex1 sagte, fügen Sie etwas mehr Entropie hinzu. Vielleicht ein Timestamp Wert oder so ähnlich. – NotMe

1

Es kann sein, dass die Skripte nicht in der Reihenfolge in der Warteschlange haben sie auf den Kopf hinzugefügt werden, sondern werden so schnell interpretiert wie sie sind Activestate abgeschlossen ist, entweder aus dem Cache oder einem Download. Wenn das zuletzt angeforderte Skript zuerst geladen wird, kann dies zu einem Problem führen.

IE8 erlaubt 6 gleichzeitige Skripte, glaube ich IE7 4 erlaubt und 6 erlaubt 2.

ich dies in Opera, Chrome und Safari als auch gesehen haben, (aber nicht firefox noch) nicht so, wenn ich lade mehr als ein Skript führe ich irgendwelche Befehle aus, bis ich weiß, dass die Ressourcen verfügbar sind - normalerweise durch Testen des Typs einer Funktion aus der erforderlichen Datei und eines Timer-Callbacks, falls nicht gefunden.

+0

Dies kann der Fall sein. Ich habe dieses Problem jedoch reproduziert, wenn nur ein einziges Skript zur Seite hinzugefügt wurde. Ich habe die Schleife hinzugefügt, um das Problem zuverlässiger reproduzieren zu können. –

Verwandte Themen