Entonces, estoy tratando de encontrar una respuesta a por qué está ocurriendo este problema; He solucionado el problema, pero quiero saber por qué sucedió.

TL; DR

El código de seguimiento de conversiones proporcionado por Google que inyectó un iframe usando document.write repentinamente hizo que la página dejara de ejecutarse en todas las versiones de Internet Explorer, pero se solucionó inyectando el mismo iframe usando un método que no es document.write.

La historia:

Doubleclick es una red publicitaria que proporciona un fragmento de JavaScript para rastrear las conversiones de los anuncios.

El fragmento que dan se ve así:

<SCRIPT language="JavaScript">
var axel = Math.random()+"";
var a = axel * 10000000000000;
document.write('<IFRAME SRC="https://fls.doubleclick.net/activityi;src=143;type=donat01;cat=indir4;ord=1;num='+ a + '?" WIDTH=10 HEIGHT=10 FRAMEBORDER=0></IFRAME>');
</SCRIPT>
<NOSCRIPT>
<IFRAME SRC="https://fls.doubleclick.net/activityi;src=143;type=donat01;cat=indir4;ord=1;num=1?"
WIDTH=1 HEIGHT=1 FRAMEBORDER=0></IFRAME>
</NOSCRIPT>

Ahora, sé que, por todo tipo de razones, document.write es peligroso y debe evitarse. Pero, Google me está dando este código, así que pensé que podía confiar en él.

De repente comenzó a romper todas nuestras páginas para todos los usuarios que usan Internet Explorer. Al igual que en, la página dejará de mostrarse por completo una vez que llegue a document.write. Esto fue una locura: ¡uno de los mayores anunciantes de terceros en Internet me había dado JavaScript que había LITERALMENTE roto mis páginas de compra para el 25% de mi tráfico!

Como triaje, rápidamente sustituí el mismo código usando la técnica de inyección que se encuentra en Google Analytics:

var iframe = document.createElement('iframe');
iframe.src = //the URL;
iframe.width = 0;
iframe.height = 0;
iframe.frameborder = 0;
var ref = document.getElementsByTagName('script')[0];
ref.parentNode.insertBefore(iframe, ref);

Esto resolvió el problema, sin explicar realmente:

¿Por qué un iframe casi vacío, inyectado usando document.write, rompe Internet Explorer, pero este método anterior no lo hace?

13
Yahel 3 jul. 2011 a las 07:21

6 respuestas

La mejor respuesta

Parece que tiene un problema similar que tuve varios meses atrás. El document.write se dispara y sobrescribe la página. Simplemente use iframe directamente, y todo debería ser kosher.

0
Community 23 may. 2017 a las 12:02

Intenté replicar su problema pero no pude en IE9.

O no tengo la configuración de prueba correcta o parece que IE antes de IE 9 tenía algún error. Firefox tenía un error de simialr: https://bugzilla.mozilla.org/show_bug.cgi?id = 293633

Tal vez sea una combinación de iframe no cerrado y algo dentro de la página que se está representando.

0
Mrchief 11 jul. 2011 a las 03:45

No sé acerca de la estructura de su sitio, pero normalmente la primera etiqueta de script está en <head>. No se representaría un iframe en <head>. Apuesto a que si lo hiciste document.body.getElementsByTagName('script')[0] probablemente tengas problemas similares a los que describiste anteriormente.

0
cwallenpoole 6 jul. 2011 a las 15:01

document.write() bloquea el procesamiento de la página hasta que finalice. Supongo que la secuencia de comandos remota tardaba un tiempo en cargarse y, por lo tanto, bloqueaba el resto de la página.

También supongo que la función Math.Random () no ayuda.

Además ... los códigos de seguimiento de Google me asustan ... tienden a ser trucos feos de javascript.

0
timw4mail 5 jul. 2011 a las 12:21

Hay 2 razones por las cuales el primer método debe ser lento.

  • document.write () bloquea hasta que realmente se realiza
  • el evento de carga de la ventana no se activa hasta que todos sus iframes y todos los recursos en estos iframes se hayan cargado por completo

Su solución funciona porque el iframe que crea no solicita la URL remota hasta después del evento de carga. Con un tiempo de espera establecido en el primer código, también obtendría la página para cargar, luego la solicitud a la url remota para que se active.

En cuanto a por qué el cambio de código rompió el sitio, parece que no puedo encontrar ninguna diferencia de velocidad de transferencia entre los dos. Tal vez parecía más rápido porque estaba en caché.

0
Revolution42 5 jul. 2011 a las 14:11