在doc上执行write:除非明确打开,否则无法从异步加载的外部脚本写入文档。

时间:2014-06-19 02:25:07

标签: javascript asynchronous onload document.write

我正在尝试在页面加载执行后加载某个脚本,如下所示:

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)中产生以下消息(不是错误)

无法在“文档”上执行“写入”:除非明确打开,否则无法从异步加载的外部脚本写入文档。

这甚至意味着什么?我应该采取不同的做法吗?即使我得到预期的行为?

3 个答案:

答案 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脚本。我不得不从页脚移动这些脚本并将它们直接放在页面中,从而消除了通知。