jQuery:如果在页面底部使用外部JS,为什么要使用document.ready?

res*_*ign 87 html javascript jquery

我将所有JS作为外部文件包含在页面的最底部.在这些文件中,我有几个像这样定义的方法,我从ready事件中调用它:

var SomeNamepsace = {};

SomeNamepsace.firstMethod = function () {
    // do something
};

SomeNamepsace.secondMethod = function () {
    // do something else
};

$(document).ready(function () {
    SomeNamepsace.firstMethod();
    SomeNamepsace.secondMethod();
});
Run Code Online (Sandbox Code Playgroud)

然而,当我删除ready函数并直接调用方法时,一切都运行相同,但执行速度明显更快 - 在一个非常基本的文件上几乎快一秒!由于此时应该加载文档(因为所有标记都出现在脚本标记之前),还有什么理由仍然使用ready事件吗?

Cre*_*esh 115

好问题.

围绕整个"在页面底部放置脚本"的建议以及它试图解决的问题存在一些混淆.对于这个问题,我不打算讨论是否在页面底部放置脚本会影响性能/加载时间.$(document).ready 如果您还将脚本放在页面底部,我只会谈论您是否需要.

我假设你正在引用那些你在你的脚本中调用立即(任何东西那样简单功能的DOM documentdocument.getElementById).我还假设你只询问这些[DOM-referencing]文件.IOW,您的DOM引用代码所需的库脚本或脚本(如jQuery)需要在页面的前面放置.

回答你的问题:如果你在页面底部包含你的DOM引用脚本,不,你不需要$(document).ready.

解释:没有"onload"$(document).ready经验法则那样的相关实现的帮助:任何与页面内DOM元素交互的代码都应该放在/包含在页面的下方,而不是它引用的元素.最简单的方法是在结束前放置代码</body>.看到这里这里.它也适用于IE的可怕"操作中止"错误.

话虽如此,这绝不会使使用无效$(document).ready.在加载对象之前引用一个对象是在DOM JavaScript中开始时最常见的错误之一(见证了它太多次计算).它是jQuery的问题解决方案,它不需要你考虑这个脚本相对于它引用的DOM元素的位置.这对开发者来说是一个巨大的胜利.这只是他们不得不考虑的一件事.

此外,将所有DOM引用脚本移动到页面底部通常很困难或不切实际(例如,任何发出document.write调用的脚本都必须保持不变).其他时候,您正在使用一个框架来渲染一些模板或创建动态javascript片段,其中引用需要在js 之前包含的函数.

最后,它曾经是"最佳实践",将所有DOM引用代码都插入其中window.onload,但是$(document).ready出于良好的文档原因,它已被实现所黯然失色.

所有这些加起来$(document).ready是一个非常优越,实用和通用的解决方案,太早引用DOM元素的问题.

  • 不完全正确,如果你有任何`defer`脚本文件准备就绪,将确保它们在准备好的代码之前执行.请参阅:http://www.w3.org/TR/html5/the-end.html#the-end (8认同)
  • "如果你在页面底部包含你的DOM引用脚本,不,你不需要$(文档).ready."忽略你在帖子中稍后解决的document.write问题,这个答案做出了天真的假设,即在运行javascript之前下载并处理所有CSS.这可能不是真的; 浏览器可以并行下载外部文件. (5认同)