我正在尝试理解 async
和 defer
HTML 5 属性。这是我的测试代码:
<body>
<script type="text/javascript" src="script.js" **defer**></script>
<div id="div1">
Abc
</div>
</body>
脚本.js:
document.write("Hello World!")
据我了解,根据定义,“defer ...指定在页面解析完成时执行脚本”输出不应该是:
Abc
Hello World!
代替
Abc
这是什么情况?
为什么 document.write()
不能使用 defer?
答案“document.write clears page”没有考虑 defer 属性。最终的答案是相似的,但我的问题是从另一个 Angular 提出的。
最佳答案
如果您在 Chrome 上打开 JavaScript 控制台,您将看到以下消息:
Failed to execute 'write' on 'Document': It isn't possible to write into a document from an asynchronously-loaded external script unless it is explicitly opened.
不从延迟(异步)脚本执行 document.write
是有道理的。考虑到这一点:
defer
指示浏览器在加载和解析文档后等待并执行代码。document.write
写入文档流。- 如果在关闭(加载)文档时调用
document.write
,则自动调用document.open
,清除文档并替换为document.write
.
阻止在延迟脚本中执行 document.write
将阻止页面/文档被清除并且只显示 document.write
的内容。
还会有“内容应该写在哪里?”的问题。在您的问题中,您希望得到 Abc Hello World
的结果,但我希望得到 Hello World Abc
,因为我仍然希望在 脚本之后立即写入内容
标记而不是在文档的末尾。
最好使用异步情况下支持的不同方法,这将使您可以控制内容的放置位置,例如 appendChild
或 insertBefore
.
关于javascript - HTML 5 延迟属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719149/