HTML 5推迟属性

时间:2016-01-11 10:25:37

标签: javascript html5

我试图理解async& defer HTML 5属性。这是我的测试代码:

<body>
    <script type="text/javascript" src="script.js" **defer**></script>
    <div id="div1">
        Abc
    </div>  
</body>

的script.js:

document.write("Hello World!")

据我了解,根据定义,&#34; defer ...指定在页面完成解析后执行脚本&#34;输出不应该是:

Abc
Hello World! 

而不是

Abc 

情况如何?

为什么document.write()不适用于推迟?

答案&#34; document.write清除页面&#34;没有考虑延迟属性。由此产生的最终答案是类似的,但我的问题是从另一个角度提出来的。

1 个答案:

答案 0 :(得分:5)

如果您在Chrome上打开JavaScript控制台,则会看到以下消息:

  

无法执行&#39;写&#39; on&#39; Document&#39;:除非明确打开,否则无法从异步加载的外部脚本写入文档。

不从延迟(异步)脚本执行document.write是有道理的。考虑到这一点:

  • defer表示浏览器在加载和解析文档时等待并执行代码。
  • document.write写入文档流。
  • 如果在文档关闭(加载)时调用document.write,则会自动调用document.open,文档将被清除并替换为document.write的内容。

阻止在延迟脚本中执行document.write将阻止清除页面/文档,并仅显示document.write的内容。

还有一个问题是&#34;内容应该写在哪里?&#34;在您的问题中,您希望得到Abc Hello World的结果,但我希望Hello World Abc,因为我仍然希望在script标记后面而不是在文档末尾写入内容

最好使用异步情况下支持的其他方法,这样可以控制内容的放置位置,例如appendChildinsertBefore