在doc上执行写操作:除非明确打开,否则无法从asynchronous加载的外部脚本写入文档。
我试图加载页面加载执行后,某些脚本,如下所示:
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)中会产生以下消息(不是错误)
无法在“文档”上执行“写入”:除非明确打开,否则无法从asynchronous加载的外部脚本写入文档。
这甚至意味着什么? 我应该做一些不同的事情吗? 即使我得到预期的行为?
一个asynchronous加载的脚本很可能在文档被完全parsing和closures之后运行。 因此,你不能从这样的脚本中使用document.write()
(技术上你可以,但是它不会做你想做的)。
您将需要通过创buildDOM元素,然后使用.appendChild()
或.appendChild()
或者.innerHTML
.insertBefore()
或设置.innerHTML
或某种机制将具有显式DOM操作的.appendChild()
像这样直接的DOM操作。
例如,而不是内联脚本中的这种types的代码:
<div id="container"> <script> document.write('<span style="color:red;">Hello</span>'); </script> </div>
你可以用这个来代替上面的dynamic加载的脚本中的内联脚本:
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>';
晚会有点迟,但Krux为此创build了一个脚本,称为Postscribe 。 我们能够用这个来解决这个问题。
如果这对任何有这个问题的人都有用。 我正在通过jQuery将页脚引入网页。 在这个页脚里面有一些Google脚本用于广告和redirect。 我必须将这些脚本从页脚中移出,并将它们直接放在页面中,从而消除了通知。