Advertencia: se ignoró una llamada a document.write () desde un script externo cargado de forma asíncrona. ¿Cómo es esto arreglado?

En mi aplicación Ruby on Rails estoy usando el plugin de Facebox para una window emergente Ajax. Tengo 2 páginas llamadas add_retail_stores/new.html.erb y add_retail_stores/new.js La página new.js henetworkinga todos los elementos de la página new.html.erb para que se vea exactamente igual. Tengo un script de map de Google en la página HTML que funciona como debería. Pero la página new.js que aparece en mi página diferente se llama página add_store_prices.html.erb ( <%= link_to add_retail_store_path, :remote => true %> )

Me sale el error:

Advertencia: se ignoró una llamada a document.write () desde un script externo cargado de forma asíncrona. Archivo de origen: http: // localhost: 3000 / add_store_prices Línea: 0

Creo porque está intentando pasar por 2 funciones / scripts. El primero para Facebox y luego el script de Google. ¿Alguien sabe cómo manejar este error?

EDITAR:

Creo que el plugin de Facebox está utilizando document.write pero no estoy seguro de dónde, tal vez en una de estas 2 líneas en mi página?

new.js:

 $.facebox('<%= escape_javascript(render :template => 'business_retail_stores/new.html') %>') $('#facebox form').data('remote','true'); 

No use document.write. El script se está cargando de forma asíncrona, lo que significa que está separado del estado de análisis del documento. Literalmente, NO HAY MANERA para que el motor JS sepa DÓNDE debe ejecutarse document.write en la página.

La secuencia de commands externa podría cargarse instantáneamente y document.write se ejecuta donde la label <script src="..."> es, o podría golpear un net.burp y cargar una hora más tarde, lo que significa que document.write se label en el final de la página. Literalmente es una condición de carrera, por lo que los motores JS ignorarán document.writes de los scripts cargados de forma asíncrona.

Convierta document.write para usar operaciones DOM normales, protegidas por un manejador de tipo document.onload .

Si tiene acceso al file .js en cuestión, su mejor solución será modificar el método "document.write ()" y replacelo con lo que tenga sentido para distribuir el contenido que contiene.

Las razones para esto están muy bien descritas arriba.

Si está utilizando document.write para escribir tags html en la página:

 document.write("<script src=...></script>"); 

o

 document.write("<img href=... />"); 

Considere usar el mismo tipo de formatting asynchronous que ya ha estado usando:

 // Add/Remove/Sugar these components to taste script = document.createElement("script"); script.onload = function () { namespaced.func.init(); }; script.src = "http://..."; document.getElementsByTagName("script")[0].parentNode.appendChild(script); 

Si buscas agregar elementos DOM que el usuario puede ver e interactuar, entonces es mejor que:

a) Tomando un containter específico (sección / div) por id, y agregando su contenido:

 document.getElementById("price").innerHTML = "<span>$39.95</span>"; 

b) Crear contenido fuera de DOM e inyectarlo en su contenedor:

 var frag = document.createDocumentFragment(), span = document.createElement("span"); span.innerText = "39.95"; frag.appendChild(span); document.getElementById("price").appendChild(frag); 

De nuevo, Sugar a tu gusto.

Si NO tienes acceso a mod este segundo file .js, te sugiero que lo lleves con ellos.

Tuve el mismo problema al cargar Google Maps con la biblioteca de lugares. Anulo temporalmente la function de escritura para crear un nuevo elemento de guión en el encabezado.

 (function() { var docWrite = document.write; document.write = function(text) { var res = /^<script[^>]*src="([^"]*)"[^>]*><\/script>$/.exec(text); if (res) { console.log("Adding script " + res[1]); var head = document.getElementsByTagName('head')[0]; var script = document.createElement("script"); script.src = res[1]; head.appendChild(script); } else { docWrite(text); } } })(); 

Ahora todo lo que tengo que hacer para cargar un script de forma asíncrona es

 document.write('<script src="http://maps.googleapis.com/maps/api/js?libraries=places"></script>'); 
    Intereting Posts