我正在尝试在页面加载执行后加载某个脚本,如下所示:
function downloadJSAtOnload(){
var element = document.createElement("script");
element.src = "scriptSrc";
document.body.appendChild(element);
}
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
虽然这个脚本似乎执行并下载'scriptSrc',并在body标记结束之前附加它,但它在控制台(chrome)中产生以下消息(不是错误)
无法在“文档”上执行“写入”:除非明确打开,否则无法从异步加载的外部脚本写入文档。
这甚至意味着什么?我应该采取不同的做法吗?即使我得到预期的行为?
答案 0 :(得分:75)
在完全解析和关闭文档之后,可能会运行异步加载的脚本。因此,你不能从这样的脚本中使用document.write()
(技术上你可以,但它不会做你想要的)。
您需要通过创建DOM元素,然后将其插入到具有document.write()
或.appendChild()
或设置{ {1}}或者像这样的直接DOM操作的一些机制。
例如,代替内联脚本中的此类代码:
.insertBefore()
您可以使用它在动态加载的脚本中替换上面的内联脚本:
.innerHTML
或者,如果容器中没有其他内容需要添加,您只需执行此操作:
<div id="container">
<script>
document.write('<span style="color:red;">Hello</span>');
</script>
</div>
答案 1 :(得分:21)
派对有点晚了,但Krux为此创建了一个名为Postscribe的脚本。我们能够用它来解决这个问题。
答案 2 :(得分:2)
如果这对我有同样问题的任何人都有用。我通过jQuery将页脚引入网页。在页脚内部有一些用于广告和重定向的Google脚本。我不得不从页脚移动这些脚本并将它们直接放在页面中,从而消除了通知。