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

Par*_*lia 66 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;
Run Code Online (Sandbox Code Playgroud)

虽然这个脚本似乎执行并下载'scriptSrc',并在body标记结束之前附加它,但它在控制台(chrome)中产生以下消息(不是错误)

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

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

jfr*_*d00 79

在完全解析和关闭文档之后,可能会运行异步加载的脚本.因此,你不能使用document.write()这样的脚本(技术上你可以,但它不会做你想要的).

您需要更换任何document.write()通过创建DOM元素,然后将它们插入到特定的父母在与明确的DOM操作该脚本语句.appendChild().insertBefore()或设置.innerHTML或某种机制直接DOM操作类似.

例如,而不是内联脚本中的此类代码:

<div id="container">
<script>
document.write('<span style="color:red;">Hello</span>');
</script>
</div>
Run Code Online (Sandbox Code Playgroud)

您可以使用它在动态加载的脚本中替换上面的内联脚本:

var container = document.getElementById("container");
var content = document.createElement("span");
content.style.color = "red";
content.innerHTML = "Hello";
container.appendChild(content);
Run Code Online (Sandbox Code Playgroud)

或者,如果容器中没有其他内容需要添加,您可以简单地执行此操作:

var container = document.getElementById("container");
container.innerHTML = '<span style="color:red;">Hello</span>';
Run Code Online (Sandbox Code Playgroud)

  • @Pacerier - 在文档加载完成后使用`document.write()`导致当前文档被清除,然后写入新的空白文档.如果您想要这种行为,那么只需在插入内容之前清除当前的DOM.如果您有比这更详细的问题,请提出一个新问题,显示您的代码并描述所需的结果. (2认同)

the*_*her 22

派对有点晚了,但Krux为此创建了一个名为Postscribe的脚本.我们能够用它来解决这个问题.