Javascript 为什么$()准备就绪(处理程序)“;不推荐吗?
从forJavascript 为什么$()准备就绪(处理程序)“;不推荐吗?,javascript,jquery,callback,document-ready,Javascript,Jquery,Callback,Document Ready,从forready 以下三种语法都是等效的: $(文档).ready(处理程序) $().ready(处理程序)(不建议这样做) $(处理程序) 在做了家庭作业——阅读和玩耍之后,我不知道为什么 $().ready(handler) 不建议使用。第一种方法和第三种方法完全相同,第三种方法使用文档对缓存的jQuery对象调用ready函数: rootjQuery = jQuery(document); ... ... // HANDLE: $(function) // Shortcut
ready
以下三种语法都是等效的:
- $(文档).ready(处理程序)
- $().ready(处理程序)(不建议这样做)
- $(处理程序)
$().ready(handler)
不建议使用。第一种方法和第三种方法完全相同,第三种方法使用文档对缓存的jQuery对象调用ready函数:
rootjQuery = jQuery(document);
...
...
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
但是ready函数与所选节点元素的选择器没有交互作用,ready
源代码:
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.add( fn );
return this;
},
如您所见,它只是将回调添加到内部队列(readyList
),而不更改或使用集合中的元素。这使您可以对每个jQuery对象调用ready
函数
比如:
- 常规选择器:
$('a')。就绪(处理程序)
- 无意义选择器:
$('fdhjjkdafdsjkjriohfjdnfj').ready(handler)
- 未定义的选择器:
$()。就绪(处理程序)
最后。。。对于我的问题:为什么不建议使用$().ready(handler)
?由于不同的选项所做的事情与您指出的几乎相同,现在是时候戴上library writer帽子并进行一些猜测了
也许jQuery人员希望将来可以使用$()
(值得怀疑,因为$().ready
是有文档记录的,即使不建议使用;如果有特殊情况,它也会污染$
的语义)
一个更实际的原因是:第二个版本是唯一一个没有包装文档的版本,因此在维护代码时更容易被破坏。例如:
// BEFORE
$(document).ready(foo);
// AFTER: works
$(document).ready(foo).on("click", "a", function() {});
将此与
// BEFORE
$().ready(foo);
// AFTER: breaks
$().ready(foo).on("click", "a", function() {});
与上述内容相关:ready
是一个怪胎,因为无论jQuery对象包装什么,它(唯一?)方法都会以相同的方式工作(即使它没有像这里那样包装任何内容)。这是与其他jQuery方法的语义的一个主要区别,因此不鼓励特别依赖它
更新:正如Esailija的评论所指出的,从工程角度来看,ready
应该是一种静态方法,因为它的工作原理是这样的
更新#2:挖掘源代码,似乎在1.4分支$()
中的某个点被更改为匹配$([])
,而在1.3中它的行为类似于$(文档)
。这一更改将强化上述理由。我想说,这只是因为$()
返回了一个空对象,而$(文档)
没有,所以您将ready()
应用于不同的事物;它仍然有效,但我认为它不是直观的
$(document).ready(function(){}).prop("title") // the title
$().ready(function(){}).prop("title") //null - no backing document
我认为这实际上是为了可读性而不是其他任何东西
这张没有那么有表现力
$().ready(handler);
作为
也许他们正试图推广某种形式的惯用jQuery。只是为了清楚地表明这三种形式之间存在一些不一致,加上我添加了第四种常用形式:(function($){}(jQuery))代码>
使用此标记:
<div >one</div>
<div>two</div>
<div id='t'/>
上一条语句中div的显示结果为:0:9:9:9:undefined
因此,只有Handler和Doc版本与jQuery约定一致,即在获取文档选择器时返回有用的内容,并且对于传递的表单,您必须返回一些内容(我认为我不会这样做,但将其放进去只是为了显示“内部”有一些内容)
这里有一个供好奇者使用的小提琴版本:这很可能只是一个文档错误,应该加以修复,使用$()的唯一缺点是它的可读性。当然,有人认为$(handler)
同样不可读。我同意,这就是我不使用它的原因
你也可以说一种方法比另一种更快。但是,您在单个页面上的一行中调用此方法的次数是否足以注意到差异
归根结底,这取决于个人偏好。除了readability参数外,使用$().ready(handler)
没有任何缺点。我认为文档在本例中没有引导。我从一位jQuery开发人员那里得到了一个正式答案:
$().ready(fn)
之所以有效,是因为$()
曾经是$(文档)
的快捷方式(jQuery@ChaosPandion:对我来说,他似乎在努力理解他所使用的工具,就像在他的手背上一样。我不认为这是白费力气。问得好。如果有人感兴趣(至少在Chrome中)“未推荐”版本实际上是最快的。一个更好的问题是为什么会存在这些,它应该是一个静态方法(例如,$.ready
)而且一开始不需要构造jQuery对象。@Esailija是最好的选择。除非jQuery计划提供某种类型的.ready()
对于单个元素的功能,应该没有理由构造jQuery对象。@chaosption。你不能使用…$。ready
已被内部jQuery函数使用,请在源代码中搜索ready:
。但我从未见过这样的代码,以前的习惯用法是$(文档)。ready(函数(){//your code here});
我无法理解第二次更新,您能详细说明一下吗?我搜索了旧版本,但找不到这个空jQuery对象问题的任何区别。@gdoron:我是说从selector=selector | | document
更改为if(!selector)退回此
。是的,同样的看法也存在。因此,在发布新退货政策的1.4版中进行了更改
<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);
});