$(document).ready必要吗?

121

我在stackoverflow上看到了这个问题,但并不认为它得到了回答。

$(document).ready是否必要?

我将所有的javascript链接放在页面底部,因此理论上它们都是在文档准备好之后运行的。


3
较旧的浏览器可能无法享受新版本浏览器所使用的并行下载功能。这就是脚本放置在底部的主要原因。它可以让较旧的浏览器先呈现您的 HTML 和 CSS。此时,您需要选择如何检测 DOM 是否已加载完毕。两种常用的启动 js 的方法是 window.onload 和 $(document).ready(与 jQuery 结合使用)。还有其他选项,并且可以很容易地搜索到,但 window.onload 明显存在缺点。关键是 $(document).ready 常常有效且易于使用。 - BradChesney79
5个回答

136

$(document).ready是否必要?

不是必要的

如果你把所有脚本都放在</body>闭合标签前面,它们的效果是一样的。

此外,如果脚本不需要访问DOM,则除了可能依赖于其他脚本之外,它加载到何处并不重要。

对于许多CMS,您没有太多选择来确定脚本的加载位置,因此对于模块化代码来说,使用document.ready事件是一个好习惯。如果您将其用于其他地方,您真的想返回并调试旧代码吗?

离题:

顺便说一下:您应该使用jQuery(function($){...}); 而不是$(document).ready(function(){...});,因为它强制别名为$


你确定它是“完全相同的”吗?我印象中你的CSS(或其他与主HTML并行加载的代码)可能尚未完全解析。 - Zach Lysobey
7
@ZachL,在CSS完全解析之前,文档可能已经准备好了。document.ready 并不等同于 onload 事件,其中图片和其他外部资源已经加载完成。 - zzzzBov
5
这个“no”刚刚让我浪费了3个小时的工作时间.. 确保你不要把</body>和<body>弄错 :) - teejay
1
我不一定赞成强制使用别名,特别是如果需要出于某种原因使用noConflict() - Jay Blanchard
@JayBlanchard,别名在回调函数中被强制为$,在这种情况下,$指的是jQuery更合理。当然,你可以将别名改为任何你想使用的内容。 - zzzzBov
1
使用 $(window).load() 来相当于 onload - thdoan

26

6
这个问题的实质是“当我把脚本放在body底部时,我是否需要使用document ready?”,而不是“是否有一种简便的方式来编写$(document).ready()”。 - nnnnnn

4
不必要,只要你知道没有什么延迟的问题发生,而且在大多数情况下,如果你从头到尾开发了自己的项目,就会知道是否出现了该问题。
当你引入别人的代码而没有进行彻底审计时,你就不知道了。
所以,请问问自己:你是否使用了帮助你构建结构的框架或编辑器?你是否引入了别人的代码,而你又没有浏览每个文件?你准备好通过测试你的代码的操作系统、浏览器和浏览器版本矩阵吗?你需要从你的代码中挤出每一分每一秒的速度吗?
document.ready()使这些问题变得无关紧要。document.ready()旨在让您的生活更轻松。它会产生一些(我敢说可以接受的)性能损失。

我看到了一些东西 - 你的一个编辑被拒绝了,但在我看来它看起来很好。你可能想重新提交一下:http://stackoverflow.com/review/suggested-edits/3224385 - Qantas 94 Heavy

1

我在互联网上看到了关于使用jQuery的document.ready的参考和博客文章。在我看来,无论是使用它还是将所有JavaScript放在页面底部都是有效的。现在的问题是哪种方法更好?这只是一种编程风格的问题。


0
不需要。您可以将脚本标签放在body结束标记之前,或者如果您支持IE9+,可以使用本机JS。
<script>alert('DOM Loaded!');</script>
</body>

<script>
document.addEventListener("DOMContentLoaded", function(event) { 
      // DOM has loaded ready to fire JS scripts
    });
</script>

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