$(文件)。就绪(函数(){}); vs页面底部的脚本

时间:2011-05-17 05:36:06

标签: javascript jquery

在页面底部编写脚本并在

中编写脚本有什么区别/优点/缺点
$(document).ready(function(){});

2 个答案:

答案 0 :(得分:141)

本身很少,无论哪种方式,DOM都可以为你操作(我很紧张,直到我阅读this from Google)。如果你使用页面结尾技巧,你的代码可能会被称为最轻微,最轻微的一点,但没有什么是重要的。但更重要的是,这个选择与您将JavaScript链接到页面的位置有关。

如果您在script中加入head标记并依赖ready,则浏览器会在向用户显示任何内容之前遇到您的script标记。在正常的事件过程中,浏览器停止运行并下载脚本,启动JavaScript解释器,然后将脚本交给它,然后在解释器处理脚本时等待(然后jQuery以各种方式监视)为DOM做好准备)。 (我说“在正常的过程中”,因为某些浏览器支持script标记上的async or defer属性。)

如果您在script元素的末尾添加了body标记,则在您的网页已基本显示给用户之前,浏览器不会执行所有这些操作。这可以改善页面的感知加载时间。

因此,要获得最佳的感知加载时间,请将脚本放在页面底部。 (这也是the guideline from the Yahoo folks。)如果您要这样做,那么就没有必要使用ready,但如果您愿意,当然可以。{/ p>

但是有一个代价:您需要确保用户可以看到的内容已准备好与之互动。通过将下载时间移动到页面大量显示之后,可以增加用户在加载脚本之前开始与页面交互的可能性。这是将script标记放在最后的反驳论据之一。通常这不是一个问题,但你必须查看你的页面,看它是否是,如果是,你想如何处理它。 (您可以在script中放置一个小的内联 head元素,用于设置文档范围的事件处理程序以应对此问题。这样,您可以获得更长的加载时间但如果他们试图过早做某事,你可以告诉他们,或者更好的是,将他们想要做的事情排队,并在你的完整脚本准备就绪时进行。)

答案 1 :(得分:3)

通过在整个DOM中散布$(document).ready()脚本(而不是最后的所有脚本),您的页面加载速度会变慢,因为它需要首先加载同步 jQuery。

$ = jQuery。因此,如果不先加载jQuery,就不能在脚本中使用$。这种方法迫使你在页面开头附近加载jQuery,将暂停你的页面加载,直到完全下载jQuery。

你不能async加载jQuery,因为在很多情况下,你的$(document).ready()脚本会在jQuery完全异步加载之前尝试执行并导致错误,因为{{1}尚未定义。

话虽如此,有办法愚弄系统。基本上将$设置为将$函数推入队列/数组的函数。然后在页面底部,加载jQuery然后遍历队列并一次执行每个$(document).ready()一个。这允许您将jQuery推迟到页面底部,但仍然在DOM中使用$(document).ready()。我个人没有测试过它的效果如何,但理论是合理的。这个想法已经存在了一段时间,但我非常非常罕见地实现了它。但这似乎是一个好主意:

http://samsaffron.com/archive/2012/02/17/stop-paying-your-jquery-tax