javascript - HTML 5 延迟属性

标签 javascript html

我正在尝试理解 asyncdefer 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,因为我仍然希望在 脚本之后立即写入内容 标记而不是在文档的末尾。

最好使用异步情况下支持的不同方法,这将使您可以控制内容的放置位置,例如 appendChildinsertBefore.

关于javascript - HTML 5 延迟属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719149/

相关文章:

跨浏览器实例/页面刷新对本地文件的 Javascript 持久访问

javascript - 使用省略号设置下拉列表选项

javascript - Facebook Javascript SDK Audience Network 错误 1003

html - 在一段html中制作多个文本

javascript - AngularJS ng-repeat 很慢

javascript - Node js 从模块化代码结构缩小并连接到单个文件

html - DIV 标签中的奇怪属性

javascript - 从浏览器内置的查找功能中隐藏 DIV 元素

html - 如何转到位于文件夹内的 angularJS 应用程序

html - 无法将文本置于绝对定位的 div 内居中