$(document).ready(function(){}); vs脚本在页面底部


Answers:


142

无论哪种方式,DOM本身都几乎可以为您提供操作的基础(在我从Google阅读内容之前,我一直对此感到不安)。如果使用页面末尾技巧,您的代码可能会被一点一点地调用,但是没什么要紧的。但更重要的是,此选择与将JavaScript链接到页面的位置有关。

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

如果您scriptbody元素的末尾添加标签,则浏览器将不会执行所有操作,直到您的页面已大部分显示给用户为止。这可以缩短页面的加载时间。

因此,为了获得最佳的感知加载时间,请将您的脚本放在页面底部。(这也是Yahoo员工的指南。)如果您要这样做,则无需使用ready,尽管您当然可以选择使用。

但是,这样做有一个代价:您需要确保用户可以看到的事物已经准备好与之交互。通过将下载时间移至页面显示大部分之后,可以增加用户在加载脚本之前开始与页面进行交互的可能性。这是将script标签放在末尾的反论点之一。通常这不是问题,但是您必须查看页面以查看是否存在问题,如果是,则要如何处理。(您可以在中放置一个小的内联 script元素,以head设置文档范围的事件处理程序来解决此问题。这样,您可以缩短加载时间,但如果 他们尝试过早地做某事,您可以告诉他们,或者更好地,将他们想做的事情排入队列,并在准备好完整脚本后再做。)


17
+1。在加载js之前处理交互的另一种方法是使页面在不使用javascript的情况下开始工作。确保所有链接都能正常工作,尽管它们当然会触发页面重新加载。然后劫持的链接和其他的东西与JS,并添加AJAX或其他花俏:)
阿德里安·施密特

1
您如何处理动作排队?是否有设计模式或一些“通用解决方案”可供我考虑?
HC_

@HC_:“排队动作”是什么意思?
TJ Crowder

@TJCrowder在回答的最后一句中:“或者,最好将他们想做的事情排入队列,并在准备好完整脚本后执行。” 我只是想知道,是否有“最佳”的方式来做,因为我敢肯定我可以找出“某种”方式来做,但是我敢肯定,如果有其他人这样做,我会皱眉查看涉及的任何代码。
HC_

2
@HC_:我从来没有觉得需要这样做,也不知道有什么特别的标准。而五年后,在我看来,最好改用“抱歉,加载,一秒钟..”代替。(虽然如果事情加载缓慢,你有一个更大的问题。)如果我看到的东西,我认为是可以点击,点击它,什么都不会发生,只有天知道是什么,我会点击下一步。如果您将它们排队,然后在准备就绪时播放它们,那可能会...不理想。
TJ Crowder

3

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

$ = jQuery。因此,您必须$先加载jQuery,然后才能在脚本中使用。这种方法迫使您在页面的开头附近加载jQuery,这将暂停页面加载,直到完全下载jQuery。

您也不能async加载jQuery,因为在许多情况下,您的$(document).ready()脚本会在jQuery完全异步加载之前尝试执行,并导致错误,因为$还没有定义。

话虽这么说,但是有一种方法可以欺骗系统。本质上,将其设置为$等于将功能推$(document).ready()入队列/数组的功能。然后在页面底部,加载jQuery,然后遍历队列并一次执行每个队列$(document).ready()。这使您可以将jQuery推迟到页面底部,但仍在$DOM中使用它。我个人还没有测试过这种方法的效果,但是这种理论是合理的。这个想法已经存在了一段时间,但是我很少,很少见到它的实现。但这似乎是个好主意:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.