Javascript 警告:从异步加载的外部脚本调用document.write()被忽略。这是如何修复的?

Javascript 警告:从异步加载的外部脚本调用document.write()被忽略。这是如何修复的?,javascript,ruby-on-rails,google-maps,facebox,Javascript,Ruby On Rails,Google Maps,Facebox,在我的RubyonRails应用程序中,我使用了用于Ajax弹出窗口的。我有两个页面,分别是add_retail_stores/new.html.erb和add_retail_stores/new.js。new.js页面继承了new.html.erb页面中的所有元素,因此看起来完全一样。我在HTML页面上有一个谷歌地图脚本,它可以正常工作。但是在我的另一个页面上弹出的new.js页面名为add\u store\u prices.html.erb页面(true%>) 我得到一个错误: 警告:从异步

在我的RubyonRails应用程序中,我使用了用于Ajax弹出窗口的。我有两个页面,分别是
add_retail_stores/new.html.erb
add_retail_stores/new.js
new.js
页面继承了
new.html.erb
页面中的所有元素,因此看起来完全一样。我在HTML页面上有一个谷歌地图脚本,它可以正常工作。但是在我的另一个页面上弹出的
new.js
页面名为
add\u store\u prices.html.erb
页面(
true%>

我得到一个错误:

警告:从异步加载的外部脚本调用document.write()被忽略。 源文件: 行:0

我相信,因为它试图通过2个函数/脚本。第一个是Facebox,然后是Google脚本。有人知道如何处理这个错误吗

编辑: 我相信Facebox插件正在使用
文档。写
但我不确定在哪里,也许在我页面的这两行中的一行

new.js:

$.facebox('<%= escape_javascript(render :template => 'business_retail_stores/new.html') %>')
$('#facebox form').data('remote','true');
$.facebox(“'business\u retail\u stores/new.html')%>”)
$('#facebox form')。数据('remote','true');

不要使用document.write。脚本是异步加载的,这意味着它与文档解析状态分离。JS引擎根本无法知道document.write应该在页面中的何处执行

外部脚本可以立即加载,document.write在
标记所在的位置执行,或者它可以在一小时后点击net.burp并加载,这意味着document.write在页面末尾被标记。这实际上是一种竞争条件,因此JS引擎将忽略异步加载脚本中的document.write


将document.write转换为使用常规DOM操作,由
document.onload
类型处理程序保护。

如果您可以访问相关的.js文件,最好的解决方案是修改“document.write()”方法,并用任何有意义的方法替换它,以便分发其中包含的内容

上面已经很好地描述了原因

如果使用document.write将html标记写入页面:

document.write("<script src=...></script>");
如果您希望附加供用户查看和交互的DOM元素,那么最好:

a) 按id抓取特定容器(节/div),并附加内容:

// 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);
再说一次,糖合你的口味


如果您无法访问mod这第二个.js文件,我建议您与他们一起使用。

我在加载带有places库的google地图时也遇到了同样的问题。我临时重写write函数,在head中创建一个新的script元素

var frag = document.createDocumentFragment(),
    span = document.createElement("span");
span.innerText = "39.95";
frag.appendChild(span);
document.getElementById("price").appendChild(frag);
(函数(){
var docWrite=document.write;
document.write=函数(文本){
var res=/^]*src=“([^”]*)”[^>]*>$/.exec(文本);
如果(res){
log(“添加脚本”+res[1]);
var head=document.getElementsByTagName('head')[0];
var script=document.createElement(“脚本”);
script.src=res[1];
head.appendChild(脚本);
}否则{
docWrite(文本);
}
}
})();
现在我要做的就是异步加载脚本

(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);
    }
  }
})();
document.write(“”);

奇怪的是,document.write在我的应用程序中的任何地方都不存在。我正在使用脚本让谷歌地图与上面编辑的代码一起运行。你看到上面的代码有什么问题吗?看起来没问题。可能是你提到的另外两个脚本之一:facebox或谷歌的……无法看到谷歌使用doc.write,所以最像ly Facebox事实上,是的,谷歌的异步脚本确实使用document.write,如果您不传递回调。您只需将&callback=isNaN附加到谷歌地图v3脚本URL,它就不会再使用document.write了。在这一个脚本上,谷歌的总WTF。
var frag = document.createDocumentFragment(),
    span = document.createElement("span");
span.innerText = "39.95";
frag.appendChild(span);
document.getElementById("price").appendChild(frag);
(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);
    }
  }
})();
document.write('<script src="http://maps.googleapis.com/maps/api/js?libraries=places"></script>');