2011-08-31 12 views
5

Este código no funciona:document.write Invocación()

<div class="pix"><div id="addTimestamp"></div></div> 
<script type="text/javascript"> 
(function() { 
    var date = new Date(), 
     timestamp = date.getTime(), 
     newScript = document.createElement("script"); 

    newScript.type = 'text/javascript'; 
    newScript.src = 'someUrl=' + timestamp + '?'; 
    document.getElementById('addTimestamp').appendChild(newScript); 
}()) 
</script> 

El guión dinámico añade document.write(someCode which loads banners). Pero en Firebug Tengo un error:

Invoking document.write() from asynchronously-loaded external script was ignored.

+0

debe aceptar una de las respuestas – rmflow

Respuesta

4

añadir lo siguiente:

newScript.async = false; 

Su guión tiene que cargar de forma sincrónica para document.write() a trabajar (ver https://developer.mozilla.org/En/HTML/Element/Script#attr-async). Como lo tiene ahora, el script se cargará cada vez que el navegador tenga tiempo para hacerlo, por lo que no puede saber dónde se insertará su código HTML desde document.write(). El navegador decidió ignorar su llamada document.write() para evitar problemas peores.

+0

no es una solución 100% de navegador cruzado. document.write es siempre un dolor de cabeza y es mejor deshacerse de él. además, parece que todo este personal con carga dinámica se implementó exactamente para evitar la carga de sincronización. – shabunc

1

redacción de documentos Javascript hace que el analizador HTML falle al ver tratar

document.getElementById('addTimestamp').innerHTML = '<script type="text/javascript"  src="someUrl=' + timestamp + '?"' + 'charset="utf-8"></sc' + 'ript>'; 

Sin embargo, si desea insertar una etiqueta de script en el DOM en lo que necesita también tener la certeza de que el DOM está cargado.

0

Levon, parece que está tratando de superar los problemas con la velocidad de carga de la página (no veo otras razones para no simplemente insertar el script estáticamente).

La respuesta de Wladimir es buena y válida, pero vea mi comentario en su respuesta.

Otro enfoque, que funciona, pero que debe implementarse muy cuidadosamente, es sobrescribir el documento. Escribir solo. Es un trabajo muy, muy, sutil, necesita ser probado exhaustivamente, pero se puede hacer, en realidad. Cada llamada de document.write puede almacenar algo en algún tipo de buffer de cadena. Luego, al decidir de alguna manera que es hora de eliminar todo el contenido, simplemente inserte todo el contenido de los buffers en algún elemento DOM.

Funciona, pero es muy pervertido. La mejor opción es no utilizar para nada document.write. Pero, por desgracia, no siempre es la opción.