对文档执行写:这是不可能的,除非它被明确地打开写入到一个文件从一个异步加载外部脚本。对文档执行写:这

2019-05-09 06:44发布

我想以后的页面加载执行,像这样的东西加载某些脚本:

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标签结束前添加它,它产生在控制台(铬)以下消息(而不是错误)

未能在“文档”执行“写”:这是不可能的,除非它被明确地打开写入到一个文件从一个异步加载外部脚本。

这是什么意思,甚至? 而且我应该做不同的东西吗? 即使我得到预期的行为吗?

Answer 1:

一个异步加载脚本可能会运行后该文档已被完全解析和关闭。 因此,你不能使用document.write() ,从这样一个脚本(以及技术上可以,但你想要什么也不会做)。

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

例如,代替在直列脚本这种类型的代码:

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

你可以使用这个在动态加载脚本,以取代上述联脚本:

var container = document.getElementById("container");
var content = document.createElement("span");
content.style.color = "red";
content.innerHTML = "Hello";
container.appendChild(content);

或者,如果有在您需要的只是追加到,你可以简单地做这个容器中没有其他内容:

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


Answer 2:

有点迟到了,但KRUX创造了这个剧本,叫Postscribe 。 我们可以用这个来突破这个问题。



Answer 3:

在这种情况下是有用的人我有同样的问题。 我通过jQuery带来页脚到网页。 内部的页脚是一些谷歌的脚本广告和重新定位。 我不得不从页脚移动这些脚本,并直接将它们放置在页面并清除通知。



文章来源: Execute write on doc: It isn't possible to write into a document from an asynchronously-loaded external script unless it is explicitly opened.