Javascript 警告:从异步加载的外部脚本调用document.write()被忽略。这是如何修复的?
在我的RubyonRails应用程序中,我使用了用于Ajax弹出窗口的。我有两个页面,分别是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%>) 我得到一个错误: 警告:从异步
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>');