English 中文(简体)
为什么"$(.)ready(手)"不推荐?
原标题:Why "$().ready(handler)" is not recommended?

jQuery API docs网站 ready

下列三种语法均等同:

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

做家庭作业后-阅读和玩弄>源代码,我不知道为什么

$().ready(handler) 

不推荐。 第一条和第三条方法完全相同, 第三个选项使用 < code> document 来调用缓存的 jQuery 对象上的即时功能 :

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

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

但准备状态函数与选定节点元素( ready 源代码)的选择器没有交互作用:

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

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

类似 :

  • regular selector: $( a ).ready(handler) DEMO
  • Nonsense selector: $( fdhjhjkdafdsjkjriohfjdnfj ).ready(handler) DEMO
  • Undefined selector:$().ready(handler) DEMO

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

最佳回答

jQuery 开发者之一正式回复 :

$().ready(fn) only works because $() used to be a shortcut to $(document) (jQuery <1.4)
So $().ready(fn) was a readable code.

But people used to do things like $().mouseover() and all sorts of other madness.
and people had to do $([]) to get an empty jQuery object

所以在 1. 4 中, 我们更改了它, 所以 $ () 给出了一个空jQuery, 我们刚刚做了 $ ().redi( fn) 的工作, 以免打破很多代码

$().redi(fn) 字面上现在刚刚在核心中补上,以使它适合遗留案件。

ready 函数的最佳位置是 $.redi(fn) ,但它是一个非常旧的设计决定,这就是我们现在拥有的东西。


我问他:

您是否认为$( fn) 比$(. ready( fn) 更可读?

他的回答是:

我总是做$( document).ready(fn) 在实际应用程序中,通常在应用程序中只有1个 doc 准备区块,这与维护不完全相似。

-I think$(fn) is pretty unisable too (fn) to read WorkingTM ... 只是你必须知道的东西。

问题回答

因为不同的选择 做了与你一样的事情 是时候戴上图书馆的作家帽子 做一些猜测了

  1. 也许,jQuery人希望有 $() < () > 可供今后使用(由于$().ready 已被记录为可工作,即使建议不推荐;如果有特殊情况,还会污染 $() 的语义)。

  2. 一个更实际得多的原因:第二版是唯一一个“em> non ” 结尾为包装 document ,因此在维护代码时更容易断开。 例如 :

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

    与此对比

    // BEFORE
    $().ready(foo);
    
    // AFTER: breaks
    $().ready(foo).on("click", "a", function() {});
    
  3. 与上述问题相关的是: ready 是一个怪胎,因为它是(唯一的?)方法,不管jQuery对象包装是什么(即使它没有像这里的情况那样包扎任何东西)都会同样有效。 这是与其他jQuery方法的语义的一大区别,因此,具体依靠这个方法是理所当然的。

    update: 正如Esailijas评论指出的,从工程角度看, ready 确实应该是一种静态方法,因为它这样工作。

<强度> 更新 # 2 : 挖掘源头时, 似乎在1.4 分支 < code>$ () 的某个时刻, 被修改为匹配 < code>$( ) < ([ ) , 在1.3 中, 它表现为 < code>$( document) 。 这一修改将会加强上述理由 。

我想简单地说,$() <() return a unity object,而 $(document) <(document) 并不表示您对不同事物应用 ready <() ;它仍然有效,但我认为它不是直觉。

$(document).ready(function(){}).prop("title") // the title
$().ready(function(){}).prop("title")  //null - no backing document

更有可能这只是一个文档错误, 并且应该被修正, 使用 $ (.) ready( handler) 的唯一不利之处是它具有可读性。 当然, 争论说 $( handler) 和不可读性一样。 我同意, < em > 认为我为什么不使用它 < / em > 。

您也可以争辩说, 一种方法比另一种方法更快。 但是, 您在一页的一行中多少次调用这个方法来注意到差异?

归根结底,它归结为个人偏好。使用 $(.ready( handler) ,除了可读性的论点外,没有任何不利之处。我认为,文件在本案中是错误的。

仅仅使这三种方法中存在某些不一致的明显明显现象,加上我添加了四种经常使用的表格: < code>(函数($) {(jQuery) );

有了这个标记 :

<div >one</div>
<div>two</div>
<div id= t />

和此代码 :

var howmanyEmpty = $().ready().find( * ).length;
var howmanyHandler = $(function() {}).find( * ).length;
var howmanyDoc = $(document).ready().find( * ).length;
var howmanyPassed = (function($) { return $( * ).length; }(jQuery));
var howmanyYuck = (function($) {}(jQuery));
var howmanyYuckType = (typeof howmanyYuck);

$(document).ready(function() {
    $( #t ).text(howmanyEmpty + ":" + howmanyHandler + ":" 
        + howmanyDoc + ":" + howmanyPassed + ":" + howmanyYuckType);
});

上一个语句中的 div 显示结果为: 0: 9: 9: 9: 9: 9: 9: 未定义

SO, 只有处理器和文件版本符合jQuery 的公约, 即当它们得到文件选择器时, 返回有用的东西, 而通过表必须返回一些东西( 我不会这样做, 我想, 但放进去只是为了显示“ 内边” 它有东西 ) 。

好奇的是:http://jsfiddle.net/az85G/

我认为这比什么都更适合易读性。

这个没有那么直观

$().ready(handler);

计为

$(document).ready(handler)

也许他们想推广 某种形式的特异性专辑





相关问题
selected text in iframe

How to get a selected text inside a iframe. I my page i m having a iframe which is editable true. So how can i get the selected text in that iframe.

How to fire event handlers on the link using javascript

I would like to click a link in my page using javascript. I would like to Fire event handlers on the link without navigating. How can this be done? This has to work both in firefox and Internet ...

How to Add script codes before the </body> tag ASP.NET

Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...

Clipboard access using Javascript - sans Flash?

Is there a reliable way to access the client machine s clipboard using Javascript? I continue to run into permissions issues when attempting to do this. How does Google Docs do this? Do they use ...

javascript debugging question

I have a large javascript which I didn t write but I need to use it and I m slowely going trough it trying to figure out what does it do and how, I m using alert to print out what it does but now I ...

Parsing date like twitter

I ve made a little forum and I want parse the date on newest posts like twitter, you know "posted 40 minutes ago ","posted 1 hour ago"... What s the best way ? Thanx.