2010-02-11 23 views
9

Tenemos algunos JavaScript que escriben un guión incluir a un recurso dinámico en nuestra página web para permitirnos comunicar cierta información entre páginas servidas desde diferentes servidores que están sujetos a restricciones de scripts entre sitios.IE intermitentemente no ejecuta un archivo de script añadido dinámicamente

La idea es que el navegador solicite el archivo JavaScript, que es servido por un recurso dinámico en el lado del servidor (que también pone parte de la información del servidor en la Solicitud). Luego, el navegador ejecuta el archivo JavaScript cuando se agrega a la página.

Nos hemos encontrado con un problema con Internet Explorer donde el JavaScript devuelto en la respuesta no se ejecuta intermitentemente cuando se agrega a la página. La inspección de un seguimiento de Fiddler HTTP cuando ocurre el problema muestra que el script se devuelve correctamente al navegador.

Para probar esto de forma más fiable, alteré el código que añade el guión para funcionar 1000 veces en un bucle de la siguiente manera:

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

El guión devuelto por ajavascriptfile.js simplemente incrementa un contador en mi página:

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

No se detectan excepciones ni se alertan en esta prueba.

Si esto se ejecuta correctamente, el contador debe llegar a 1000 (lo que ocurre en Firefox). Sin embargo, en IE6 tiene un promedio de 900-950, IE7 es alrededor de 995-998 y IE8 es un impactante 750-800.

¿Alguien más ha encontrado que Internet Explorer no ejecuta scripts incluidos dinámicamente? Si es así, ¿sabes cómo solucionar este problema?

+0

¿Tiene un '' declarado en la página por casualidad? –

+0

No, no tengo un en la página. –

+0

Estoy trabajando en este tema, pero no estoy seguro de por qué está mal. – JustEngland

Respuesta

0

Internet Explorer puede almacenar en caché el archivo de script. Trate de añadir un poco de entropía adicional al src incluyen:

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

El '' & num = "+ i 'será único para cada solicitud, por lo que el almacenamiento en caché no debería ser un problema. Si elimino el '' & num = "+ i ', IE7 solo realiza una única solicitud al servidor y el contador llega a 1000 casi al instante. También tenga en cuenta que, en circunstancias normales (donde se encontró este problema por primera vez), solo hay una única solicitud. Solo lo solicito 1000 veces para tratar de reproducirlo de manera más confiable. –

+0

En los sistemas de producción, el almacenamiento en caché aún podría ser un problema, es decir, ¿las URL de las secuencias de comandos son únicas cada vez que se solicitan en un entorno de producción? De cualquier manera (ya sea en un ciclo de prueba o en producción), el comportamiento de IE es inesperado/roto. – leepowers

+0

@James: Es posible que IE todavía esté almacenando en caché incluso con el & num dependiendo de cuántas veces haya solicitado esa misma URL durante su prueba. Como dijo pygorex1, agrega algo más de entropía. Tal vez un valor de marca de tiempo o algo así. – NotMe

1

Puede ser que los scripts no están haciendo cola en el orden en que se añaden a la cabeza, pero se interpretan tan pronto como estén ActiveState es completa, ya sea desde el caché o una descarga. Si el script que solicitaste último carga primero, puede causar un problema.

IE8 permite a 6 secuencias de comandos simultáneos, creo IE7 permitió 4, 6 y permitió 2.

he visto esto en Opera, Chrome y Safari, así, (pero no en Firefox aún) por lo que si estoy Cargando más de una secuencia de comandos, sostengo ejecutar comandos hasta que sepa que los recursos están disponibles, por lo general, probando el tipo de una función desde el archivo requerido, y una devolución de llamada con temporizador si no se encuentra.

+0

Este puede ser el caso. Sin embargo, he reproducido este problema al agregar solo una secuencia de comandos a la página. Agregué el ciclo para poder reproducir el problema de manera más confiable. –

Cuestiones relacionadas