警告:从异步加载的外部脚本调用document.write()被忽略.这是如何解决的
Warning: A call to document.write() from an asynchronously-loaded external script was ignored. How is this fixed?
在我的Ruby on Rails应用程序中,我使用Facebox插件作为Ajax弹出窗口。这两页分别是add_retail_stores/new.html.erb
和add_retail_stores/new.js
。new.js
页继承了new.html.erb
页的所有元素,所以看起来完全一样。我有一个谷歌地图脚本的HTML页面上的工作,因为它应该。但是new.js
页面在我的另一个页面上弹出add_store_prices.html.erb
页面(<%= link_to add_retail_store_path, :remote => true %>
)
我得到错误:
警告:从异步加载的外部脚本调用document.write()被忽略。源文件:http://localhost:3000/add_store_prices线:0
我相信是因为它试图通过两个函数/脚本。第一个用于Facebox,然后是Google脚本。有人知道如何处理这个错误吗?
编辑:
我相信Facebox插件正在使用document.write
,但我不确定在哪里,也许在我的页面上的这2行之一?
new.js:
$.facebox('<%= escape_javascript(render :template => 'business_retail_stores/new.html') %>')
$('#facebox form').data('remote','true');
不要使用document.write。脚本是异步加载的,这意味着它与文档解析状态是分离的。JS引擎根本没有办法知道文档的位置。写应该在页面中执行。
外部脚本可以立即加载和文档。write在<script src="...">
标记所在的地方执行,或者它可能碰到一个网。一小时后打嗝并载入,也就是说文件。Write在页面的末尾被标记。这实际上是一个竞争条件,所以JS引擎会忽略document。从异步加载的脚本中写入。
转换文档
document.onload
类型处理程序保护的常规DOM操作。如果您可以访问有问题的.js文件,您的最佳解决方案是修改"document.write()"方法并将其替换为任何有意义的方法,以便分发其中包含的内容。
原因如上所述。
如果您正在使用文档。Write将HTML标签写入页面:
document.write("<script src=...></script>");
或
document.write("<img href=... />");
考虑使用与您已经使用的相同类型的异步格式:
// 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);
如果您想要添加供用户查看和交互的DOM元素,那么您最好使用:
a)按id抓取特定的容器(section/div),并附加您的内容:document.getElementById("price").innerHTML = "<span>$39.95</span>";
b)在dom之外构建内容并将其注入到容器中:
var frag = document.createDocumentFragment(),
span = document.createElement("span");
span.innerText = "39.95";
frag.appendChild(span);
document.getElementById("price").appendChild(frag);
再一次,糖按你的喜好。
如果你不能修改第二个。js文件,我建议你和他们一起修改
我有同样的问题加载谷歌地图与地方库。我临时覆盖write函数,在头部创建一个新的脚本元素。
(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>');
- 如何解决Yii中的页面刷新问题
- 测试Angular Service解决错误回调中的promise
- 如何解决Access Control Allow Origin错误
- 如何解决这种情况下的非法调用类型错误
- 简单的ES6承诺问题-交换解决和拒绝参数
- 可以转换显示属性吗?如果没有,什么'这是最好的解决方案
- iPad虚拟键盘-哪一个-javasctript解决方案
- 在ES6 Promise中,我应该在解决/拒绝之前使用return吗
- 如何解决“;错误所请求的URL返回500-内部服务器错误”;
- 如何逃离<脚本>jquery html()中的标记.我使用了innerHTML和outerHTML来解决这个
- 如何解决'窗口未定义'终端上的节点JS出错
- Angularjs:如何在使用'解决'在$routeProvider中
- 可以't解决Javascript错误
- AJAX HTTP基本身份验证解决方案
- 为什么不'我的窗口滚动事件根本没有启动.其他答案没有解决问题
- 如何解决此错误
- 在chrome web商店中打开时,是否有允许执行内容/后台脚本的解决方案
- CORS故障无法解决jquery,laravel5.2
- RxJS等待承诺解决
- Angular的ui-router,可以在其他解决之前解决一个身份验证检查