【问题标题】:What is the difference between these jQuery ready functions?这些 jQuery 就绪函数之间有什么区别?
【发布时间】:2010-04-18 15:38:08
【问题描述】:

有什么区别

$(function(){

}); 

$(document).ready(function() { 

});

【问题讨论】:

  • 无。或者至少在手册中是这样说的。
  • 您可以将第一个理解为“调用一个名为 $ 的函数并将定义的函数交给它来执行”。 $ 那里引用 jQuery,它会在它准备好时执行你给它的函数。第二个读作“从文档中创建一个 jQuery 对象并为其附加一个事件监听器,当它被就绪事件触发时,它执行你给它的函数”。
  • 在下面查看我的答案:IE9 对待它们的方式不同。

标签: jquery


【解决方案1】:

Nothing whatsoever.

这个函数的行为就像 $(document).ready(),因为它应该 用于包装其他$()

你可以在source code看到这个:

rootjQuery = jQuery(document);

...

} else if ( jQuery.isFunction( selector ) ) {
    return rootjQuery.ready( selector );
}

【讨论】:

  • 有一个区别,$(function(){}) 可读性较差(至少对我的大脑而言)。
  • 同意 Rosdi 的观点——一个更能表达它的实际作用,一个更简洁。我更喜欢富有表现力的版本,认为它的性能略逊一筹:jsperf.com/ready-callback-function-vs-document-ready-function/4
  • 也与一个观察结果一致:正是速记版本缺乏表现力导致这个问题如此受欢迎。
  • 从 jQuery 3.0 开始,只推荐使用 $(function() {}) 语法;其他语法仍然有效,但已被弃用。见api.jquery.com/ready
  • 我不同意,有区别。我在函数前面使用和不使用(document).ready 尝试了完全相同的函数,并且异步正确加载了函数变量。没有,只加载变量的初始值,而不给出新的异步值。它似乎会影响时间,至少在opera
【解决方案2】:
} else if (jQuery.isFunction(selector)) {
    return rootjQuery.ready(selector);
}

来自source

调用 $(document).ready(selector) 可以节省一些 if 语句。

虽然 jQuery 确实在内部缓存 $(document),但这可能会使 $(f) 更快。

Benchmarked

【讨论】:

  • 如果我们谈论的是 级别的微优化,您可能需要考虑传输显式版本所需的额外 11 个字节...
  • @lonesomeday 好吧,它只有 9 个字节。 $(d).ready(f)$(f)
  • 没错,但请注意我的上述评论有点幽默!
  • @Raynos 但是你需要把var d = document;放在顶部或者放在(function(d) {})(document);里面。 :P
  • @Nyuszika7H 任何缩小的代码已经有d = document, w = window
【解决方案3】:

两者是等价的,第一个是简写形式。

【讨论】:

  • 你确定吗?第一个是否等待 DOM 加载?
  • 酷,只是想确定一下。 +1
【解决方案4】:

$(function(){}) 是 dom 就绪的捷径

作为参数传递给 jQuery 构造函数的函数被绑定到文档就绪事件。

【讨论】:

    【解决方案5】:

    我建议你阅读this。如您所见

    以下三种语法都是等价的:

    $(document).ready(handler)

    $().ready(handler) (this is not recommended)

    $(handler)

    所以这取决于你和你喜欢什么。

    【讨论】:

    • $().ready() 在 jQuery 1.4+ 中不起作用。 $() 在这些情况下返回空选择而不是文档。
    • @lonesomeday 所以前面有一个(不推荐)
    【解决方案6】:

    两者完全相同:使用任何你喜欢的形式。

    也就是说,我个人总是使用扩展形式$(document).ready(function(){});,原因很简单,代码在做什么是完全显而易见的。大致的想法是“自记录代码”。稍后访问代码的任何人都会立即看到代码将在documentready 事件上运行。使用简写形式,您必须依靠代码的读者来理解其含义。

    【讨论】:

      【解决方案7】:

      我们遇到过 IE9 无法在 $(function() {}); 中运行函数的情况。以与 $(document).ready(function(){}); 相同的方式或时间;

      这个问题特别针对我们从查询字符串中读取信息并处理并在屏幕上显示该信息,或使用它来处理表单。 IE9 会在使用 $(function() 缓存信息后处理该信息,并且用户刷新页面。但在第一次运行时,没有任何工作正常。但是,一旦我们从 $(function(){}); 切换到 $( document).ready(),问题已解决。我们没有改变任何其他内容。

      我非常期待有一天我不必测试 IE9 或更低版本。

      【讨论】:

      • document.ready 未连接到所有浏览器的相同“本机”事件...您可以获得以下之一:[document.DOMContentLoaded] 或 [window.load] 或 [document.onreadystatechange ]。我想这就是你在 IE 中获得不同操作的原因,我想(未经验证) $(document).ready(...) 未连接到与 $(function(){} 相同的本机 DOM 事件)
      • 我在opera 也遇到过这种情况。我赞成您的回答,因为我遇到了完全相同的问题。 (使用 jquery 3.5)
      【解决方案8】:

      它们实际上是相同的。没有区别。


      这是原生方式。

      $(document).ready(function() {
          // code
      });
      

      这是前一个的简写。

      $(function() {
          // code
      });
      

      jQuery source code

      【讨论】:

      • 在此线程上有评论 - stackoverflow.com/questions/7975093/… - 使用速记有时会导致 TypeError: 'undefined' is not a function 错误。
      • @crmpicco 除了线程提到$(document),所以你可能指的是$ 的简写jQuery
      【解决方案9】:

      我使用$(function() {});,因为它更短。据我所知,这两种方式没有区别。

      【讨论】:

        【解决方案10】:

        jQuery 推荐使用$( fn )

        $(document).ready(function() {});$(document).on("ready", fn); 将导致在文档准备好时调用该函数,但是 仅当它在浏览器触发自己之前附加 DOMContentLoaded 事件。这使得它在许多用途中不可靠, 特别是那些加载了 jQuery 或其插件的 页面加载后异步进行。

        更多信息,请关注jquery-migrate

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-10
          • 2014-04-01
          相关资源
          最近更新 更多