异步和文档就绪

新手上路,请多包涵

我尝试通过在我的脚本上放置一些 async 属性来优化我的页面。它似乎破坏了我的 javascript,因为 $(document).ready 在加载所有脚本之前执行!

我看到我可以通过放置 $(window).load 而不是 $(document).ready 来解决我的问题,但我想知道是否有更好的解决方案。这个解决方案在我的案例中触发了 2 个问题:

  1. 我必须更改所有 $(document).ready 并告诉所有开发人员不要再使用它
  2. 脚本将在加载所有图像后执行。我的网站有很多沉重的图像,我真的需要一些脚本在 dom 准备好后尽快执行。

你有什么魔术吗?也许将所有脚本放在最后?使用 defer 而不是 async

原文由 tibo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 201
2 个回答

经过广泛的研究,我可以肯定地说,将脚本放在页面末尾是最佳做法。

雅虎同意我的看法:http: //developer.yahoo.com/performance/rules.html#js_bottom

谷歌不谈论这种做法,似乎更喜欢异步脚本: https ://developers.google.com/speed/docs/best-practices/rtt#PreferAsyncResources

恕我直言,将脚本放在页面末尾比异步/延迟有几个好处:

  • 它适用于所有浏览器(是的,甚至是 IE ;))
  • 您保证执行顺序
  • 您不需要使用 $(document).ready$(window).load
  • 您的脚本可以在加载图像之前执行
  • 作为异步/延迟,您的页面将显示得更快
  • 当 DOM 触发 ready 事件时,加载所有脚本
  • 可以通过将所有 js 合并到一个文件中来优化(通过像 mod_pagespeed 这样的工具)

我能看到的唯一缺点是浏览器无法并行下载。使用 async/defer 的一个很好的理由是当你有一个完全独立的脚本(不需要依赖执行顺序)并且不需要在特定时间执行时。示例:谷歌分析。

原文由 tibo 发布,翻译遵循 CC BY-SA 3.0 许可协议

defer 在这里肯定有帮助。

defer 通常优于 async 因为它:

  • 异步加载(就像 async
  • 保证执行顺序(不像 async
  • 在最后执行(不像 async 在页面仍在加载时并行执行,它实际上 停止 了 dom 解析!)
  • jquery ready 在加载“延迟”脚本 触发(这就是你要问的)

This SO answer 有一张非常好的图片说明延迟/异步加载顺序,非常容易理解。

原文由 Alex from Jitbit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题