Me encuentro con un problema que parece solo aparecer en Windows 7. Parecía funcionar bien en IE8 en una versión diferente de Windows. Básicamente, estoy creando una nueva ventana con window.open(), luego usando document.write() para escribir el contenido de esa nueva ventana, que contiene script. En IE, estos scripts no se están ejecutando correctamente. La mayoría de las veces no ejecutan en absoluto, pero ocasionalmente uno de ellos lo hará. Esto es solo con un caché borrado: una vez que los archivos javascript están en el caché, funciona bien.Los elementos de script escritos con document.write en una ventana abierta con window.open no se ejecutan en IE8 en Windows 7
reducía caso de prueba:
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");
Cuando voy a test.html, esperaría ver una nueva ventana w aparece con alertas para "prueba" y luego "prueba 2". Lo hago en la mayoría de los navegadores, incluido IE6. Sin embargo, cuando intento esto en IE8 en Windows 7, abre la página en blanco, pero no aparecen alertas (u ocasionalmente solo una).
¿Es algún tipo de problema de tiempo? ¿Alguien más ha visto esto? ¿Hay alguna manera de evitarlo?
Editar: Aquí está el código que he intentado Rob Cooney quería ver. Una vez más, funciona en otros navegadores, pero no en Internet Explorer 8 en 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");
}
Además, he publicado esto como una pregunta en los foros de MSDN here.
Aceptando no hay solución como la mejor respuesta. Aquí está mi código modificado:
<!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>
Nota: lo que hay que tener en cuenta con esta solución es que los archivos javascript ahora se cargan de forma asíncrona, por lo que si usted tiene dependencias entre los archivos, no se puede estar seguro que cargarán en el orden correcto. Lo solucioné con setTimeout y probando la existencia de variables en el primer archivo antes de cargar el segundo archivo.
El problema real es que cuando la página se carga con 'document.write', IE siempre cargar bloques de JavaScript en línea antes de JavaScript externo archivos, independientemente de cuál se defina primero. Esto se describe en http://www.dynamicdrive.com/forums/blog.php?bt=173 (sección II). Una buena solución es poner todo como archivos javascript externos. – sayap