Les éléments de script écrit avec document.write dans une fenêtre ouverte avec window.open ne sont pas exécutés dans IE8 sous Windows 7

Je rencontre un problème qui semble apparaître uniquement sur Windows 7. Il semblait bien fonctionner dans IE8 sur une version différente de Windows. Fondamentalement, je crée une nouvelle fenêtre avec window.open (), puis en utilisant document.write () pour écrire le contenu de cette nouvelle fenêtre, qui contient le script inclus. Dans IE, ces scripts ne sont pas exécutés correctement. La plupart du temps, ils ne s'exécutent pas du tout, mais parfois l'un d'entre eux le fera. Ce n'est qu'avec un cache effacé – une fois que les fichiers javascript sont dans le cache, cela fonctionne bien.

Étui test testé:

Test.html:

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'> <html> <head> <script type="text/javascript"> var w = window.open(); var windowHTML = "\ <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n\ <html>\n\ <head>\n\ <script type='text/javascript' src='test.js'></scr"+"ipt>\n\ <script type='text/javascript' src='test2.js'></scr"+"ipt>\n\ </head>\n\ <body>\n\ </body>\n\ </html>"; w.document.write(windowHTML); w.document.close(); </script> </head> <body> </body> </html> 

Test.js:

 alert("test"); 

Test2.js:

 alert("test2"); 

Quand je vais à test.html, je m'attends à voir une nouvelle fenêtre apparaître avec des alertes pour "test" puis "test2". Je fais dans la plupart des navigateurs, y compris IE6. Cependant, lorsque j'essaye IE8 sur Windows 7, il ouvre la page blanche, mais aucune alerte ne s'affiche (ou parfois une seule).

Est-ce une sorte de problème de chronométrage? Quelqu'un d'autre a-t-il vu cela? Y a-t-il un moyen de le contourner?


Edit: Voici le code que j'ai essayé que Rob Cooney voulait voir. Encore une fois, cela fonctionne dans d'autres navigateurs, mais pas dans IE8 sous Windows 7.

Test.htm:

 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'> <html> <head> <script type="text/javascript"> var w = window.open(); var windowHTML = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n" + "<html>\n" + "<head>\n" + " <script type='text/javascript' src='test.js'></scr"+"ipt>\n" + " <script type='text/javascript' src='test2.js'></scr"+"ipt>\n" + "</head>\n" + "<body onload='test();test2()'>\n" + "</body>\n" + "</html>"; w.document.write(windowHTML); setTimeout(function() { w.document.close(); }, 10000); </script> </head> <body> </body> </html> 

Test.js:

 function test() { alert("test"); } 

Test2.js:

 function test2() { alert("test2"); } 

De plus, j'ai posté cette question sur les forums MSDN ici .


Accepter les solutions de rechange comme la meilleure réponse. Voici mon code modifié:

 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'> <html> <head> <script type="text/javascript"> var w = window.open(); var windowHTML = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n" + "<html>\n" + "<head></head>\n" + "<body></body>\n" + "</html>"; w.document.write(windowHTML); w.document.close(); var s = w.document.createElement("script"); s.type = "text/javascript"; s.src = "test.js"; w.document.getElementsByTagName("HEAD")[0].appendChild(s); var s2 = w.document.createElement("script"); s2.type = "text/javascript"; s2.src = "test2.js"; w.document.getElementsByTagName("HEAD")[0].appendChild(s2); </script> </head> <body> </body> </html> 

Remarque: la chose à surveiller avec cette solution est que les fichiers javascript sont maintenant chargés de manière asynchrone, donc si vous avez des dépendances entre les fichiers, vous ne pouvez pas être sûr qu'ils vont charger dans le bon ordre. Je me suis contenté avec setTimeout et j'ai testé l'existence de variables dans le premier fichier avant de charger le second fichier.

Essayez quelque chose comme ceci (non testé):

 var s=document.createElement('script'); s.type = "text/javascript"; s.src = "test.js"; document.body.appendChild(s); 

Vous voudrez peut-être envisager d'enrouler vos appels d'alerte dans les définitions de fonctions dans les fichiers js importés, puis d'ajouter un OnLoad à l'étiquette du corps de windowHTML qui appelle la fonction

MODIFIER:

 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'> <html> <head> <script type="text/javascript"> var w = window.open(); w.document.writeln("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">"); w.document.writeln("<html>"); w.document.writeln("<head>"); w.document.writeln("<script type=\"text/javascript\" src=\"test.js\"></scr"+"ipt>"); w.document.writeln("<script type=\"text/javascript\" src=\"test2.js\"></scr"+"ipt>"); w.document.writeln("</head>"); w.document.writeln("<body onload=\"test();test2()\">"); w.document.writeln("</body>"); w.document.writeln("</html>"); w.document.close(); </script> </head> <body> </body> </html> 

Je ne suis pas sûr de savoir quel est votre objectif d'appeler un popup … s'il n'est pas essentiel d'avoir une fenêtre séparée, vous pouvez essayer d'avoir une couche de recouvrement sur la page existante à la place … certaines personnes l'appellent une lightbox.

La fonction window.open sur certains navigateurs invite initialement l'utilisateur à "accepter les fenêtres contextuelles" (ce que je trouve ennuyant), si vous n'avez pas besoin d'un popup et que vous pouvez implémenter tout sur la même page, vous pouvez utiliser jQuery .load Fonctionnez plutôt pour charger le contenu dans un conteneur (sans recharger la page).

http://api.jquery.com/load/