为什么不推荐"$().ready(handler)"?

gdo*_*ica 88 javascript jquery callback document-ready

jQuery的API文档的网站ready

以下所有三种语法都是等效的:

  • $(文件).就绪(句柄)
  • $().ready(处理程序)(不建议这样做)
  • $(句柄)

做完作业后 - 阅读和播放源代码,我不知道为什么

$().ready(handler) 
Run Code Online (Sandbox Code Playgroud)

不推荐.第一种和第三种方式完全相同,第三种方法在缓存的jQuery对象上调用ready函数document:

rootjQuery = jQuery(document);
...
...

// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
    return rootjQuery.ready( selector );
}
Run Code Online (Sandbox Code Playgroud)

但是ready函数没有与所选节点元素的选择器交互,ready源代码:

ready: function( fn ) {
    // Attach the listeners
    jQuery.bindReady();
        // Add the callback
    readyList.add( fn );
        return this;
},
Run Code Online (Sandbox Code Playgroud)

如您所见,它只是将回调添加到内部队列(readyList)并且不会更改或使用集合中的元素.这使您可以ready在每个jQuery对象上调用该函数.

喜欢:

  • 常规选择器:$('a').ready(handler) DEMO
  • 无意义选择器:$('fdhjhjkdafdsjkjriohfjdnfj').ready(handler) DEMO
  • 未定义的选择器:$().ready(handler) DEMO

最后......对我的问题:为什么$().ready(handler)不推荐?

gdo*_*ica 87

我得到了一位jQuery开发人员的正式回答:

$().ready(fn)只能工作,因为$()曾经是$(document) (jQuery <1.4)的快捷方式
所以$().ready(fn)是一个可读的代码.

但人们习惯于做$().mouseover()各种各样的事情和各种其他疯狂事件.
人们不得不做$([])一个空的jQuery对象

所以在1.4中我们改变它所以$()给出一个空的jQuery,我们只是做了$().ready(fn)工作,以免破坏很多代码

$().ready(fn) 实际上现在只是修补核心,以使其适用于遗留案例.

功能的最佳位置ready$.ready(fn),但这是一个非常古老的设计决定,这就是我们现在拥有的.


我问他(过去式:

你认为$(fn)比$().ready(fn)更具可读性吗?

他的回答是:

我总是在实际应用程序中执行$(document).ready(fn),并且通常在应用程序中只有一个doc ready块,它不完全像维护一样.

我认为$(fn)也是非常难以理解的,它只是你必须知道的一件事 ......

  • @gdoron +1从马的嘴里直接得到它. (3认同)
  • 获得真正答案的@gdoron +1.而且,是的,我们的观念已经非常接近了. (2认同)

Jon*_*Jon 11

由于不同的选项与你指出的几乎完全相同,所以是时候戴上图书馆作家的帽子并做出一些猜测.

  1. 也许jQuery人员希望$()将来可以使用(有疑问,因为$().ready有记录的工作,即使不推荐;它也会污染$if特殊情况下的语义).

  2. 一个更实际的原因:第二个版本是唯一一个没有最终包装的版本document,因此在维护代码时更容易破解.例:

    // BEFORE
    $(document).ready(foo);
    
    // AFTER: works
    $(document).ready(foo).on("click", "a", function() {});
    
    Run Code Online (Sandbox Code Playgroud)

    与此形成鲜明对比

    // BEFORE
    $().ready(foo);
    
    // AFTER: breaks
    $().ready(foo).on("click", "a", function() {});
    
    Run Code Online (Sandbox Code Playgroud)
  3. 与上述相关:ready在某种意义上它是一个怪胎,它是(唯一的?)方法,无论jQuery对象包装什么都会起作用(即使它没有包装任何东西,就像这里的情况一样).这是与其他jQuery方法的语义的主要区别,因此特别不鼓励依赖于此.

    更新:正如Esailija的评论指出的那样,从工程角度来看,它ready应该是一种静态方法,因为它的工作方式是这样的.

更新#2:在源头挖掘,似乎在1.4分支中的某个点$()被更改为匹配$([]),而在1.3中它表现得像$(document).这一改变将加强上述理由.