Javascript [defer]属性和document.ready有什么区别?

5
阅读了在MDN上有关defer属性的介绍后,

该布尔属性用于向浏览器指示脚本应在文档解析完成后执行。

看起来很不错。因此,我已经测试了它与$(function () { });$(window).load(...)进行比较。
<script>
$(function ()
{
  alert('1')
});
$(window).load(function ()
{
  alert('2')
});
</script>

<script defer="defer">
  alert('4');
</script>

这段代码总是输出 4,1,2 !

现在我可以识别文档解析完成的时间。

在哪些情况下需要在文档准备就绪之前的阶段(解析时间完成)使用?


1
一个重要的警告:“由于其他主要浏览器尚未实现此功能,作者不应假设脚本的执行实际上会被延迟。” - jbabey
1
@jbabey 是的,我知道。但请注意 - 它将会在所有主要浏览器中实现。因此,值得了解其行为 :-) - Royi Namir
2个回答

4

来自MDN

不应该在没有src属性的脚本上使用defer属性

实际使用方法是您仍然可以在页面顶部放置脚本,并在完全解析整个页面后使浏览器加载它们,从而提高客户端性能。

来自YSlow

DEFER属性表示脚本不包含document.write,并提示浏览器可以继续渲染


那为什么不把它们放在底部呢?有什么区别吗? - Royi Namir
@RoyiNamir,对于某些模板系统/CMS,编写JavaScript的人无法访问HTML模板。此外,如果将大部分元数据保留在<head>中并且<body>严格为内容,则可以简化元数据的组织。 - zzzzBov

1

查看W3 HTML规范:

async和defer属性是布尔属性,表示脚本应如何执行。如果未出现src属性,则不能指定defer和async属性。

因此,此属性仅适用于外部脚本。


是的。很好的观点。我可以引用一个包含提示命令的js文件,这只是为了示例。你当然是正确的! - Royi Namir
是的,你应该这样做来真正测试行为。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接