回答
(跳到TL; DNR在最后,如果你讨厌读书,想总结,然后回去读了整个事情,如果你需要我在说什么澄清)
的本质jQuery
对于初学jQuery的人来说,第一个也是最令人困惑的事情就是jQuery对象是什么,以及它为什么如此工作。 jQuery的体系结构旨在允许开发人员以简单,简洁的语法选择一个语句中的所有相关元素,然后与其交互操作,而不必担心不同浏览器之间的陷阱和注意事项。因此,如果我想将事件处理程序附加到具有特定CSS类的页面上的所有链接,我希望代码看起来像$('a.my-selector').click(function() { /* my handler here */ });
,而不是看起来像document.body
的所有子元素的怪物,检查它是否是锚点元素与my-selector
类,如果是,则以该浏览器专用的方式附加所需的处理程序,并递归调用该元素的子元素。
什么是核心的方法和什么是一个插件的方法
核心和插件方法是一样的,除了核心的方法是在jQuery脚本定义,插件是由您或其他开发人员扩展定义或增强jQuery的核心功能。
核心和插件的方法(我将简单地称它们为从现在开始“方法”)是是jQuery对象的成员函数($
是jQuery
一个别名,以减少打字,所以$()
和jQuery()
是相同的)。这些方法提供了遍历,交互和操作页面元素的方法。如何方法的工作
当你调用$()
,创建jQuery核心对象的实例,它具有迄今已定义的所有方法
。此对象中还包含对您选择,引用或创建的所有浏览器HTML元素的引用,具体取决于您提供给$()
的参数。因此,在一种方法中,您应始终假定您正在处理一组元素,集合中的元素为零到多个。在大多数情况下,你的方法将是这样开始:
$.fn.myPlugin = function() {
// `this` is the jquery object. the next line iterates over each element currently
// in the collection and invokes the specified function against it.
return this.each(function() {
// within _this_ function, `this` is a reference to the current element
// here, you can interact with or manipulate the element to whatever
// ends required by your plugin.
});
};
注意$.fn
只是一个别名为$()
对象的prototype
。所以,$.prototype
和$.fn
是同义词。 fn
/prototype
只是JavaScript的一种让您添加或替换对象方法的方法。
方法应该返回什么?
除了例外情况,我会立即说明,方法应该返回结果jQuery对象。结果是什么意思?如果方法遍历或过滤当前元素,它应该返回一个包含这些新元素的jQuery对象。例如:$.fn.filter
将采用您选择的原始元素,然后删除与您指定的选择器不匹配的任何元素。例如:
$('a').filter('.my-selector'); // finds all anchor tags on the document, then removes any that don't have the class `my-selector`.
如果该方法只适用于某些行为,那么它应该只是返回的jQuery目前的元素(在这种情况下,最简单的方法只是返回的this.each
的结果,正如我上面证明)。例如:$.fn.hide
通过应用CSS display:none
使每个选定元素隐藏,因此它可能仅返回this.each
。这是非常粗略的看起来像:
$.fn.hide = function() {
return this.each(function() {
$(this).css({'display':'none'});
});
}
现在,例外。你可能有一个方法从集合中的元素中返回一个值。在这种情况下,不是可以返回一个jQuery对象,而是值。例如,$.fn.html
将所有选定元素的HTML内容作为一个字符串返回。所以,你可能会问,“好的,但为什么还要为不返回值的方法返回另一个jQuery对象?”。您可以这样做,以便开发人员可以在一次调用中将功能链接起来回到.my-selector
的例子,假设您不仅要应用点击处理程序,还要使文本变为粗体。
你可以这样说:
var myLinks = $('a.my-selector');
myLinks.click(function() { /* handle click */ });
myLinks.css({'font-weight':'bold'});
但是,这是相当冗长,在JavaScript中,every line counts against your page weight。由于所有这些方法返回一个jQuery对象,你可以链一个声明中呼吁:
$('a.my-selector').click(function() { /* handle click */ }).css({'font-weight':'bold'});
简洁得多,对不对?
效用函数
效用函数是包裹经常使用的功能静态或共享的功能。它们如上所述略微超出正常的jQuery模式,因为它们仅用于封装一些有用且可重用的逻辑。他们可以接受任何需要的参数,并返回任何想要的结果。例如,$.isArray
这样使用:
var myArray = [];
alert($.isArray(myArray)); // displays true
它被定义大致是这样的:
$.isArray = function(o) {
// check if o is array and return true or false
};
现在,你可以很容易地刚做这个“老派”的定义JavaScript的方式它是这样的:
function isArray(o) {
// check if o is array and return true or false
}
此外,你可能会问的优点是其连接到$
什么。其原因是为了防止覆盖开发人员,其他脚本甚至其他版本的jQuery定义的同名函数(如果您真的需要,可以在页面中包含jQuery的多个版本,但那是另一个故事)。
TL; DNR
$()
指的是jQuery对象的一个实例,$.fn
允许您添加或更换的jQuery对象的一个方法,并$.yourFunctionNameHere
让你定义一个“静态”或“共享”效用函数封装有用的功能,否则不会遵循jQuery实例模式。
Thx很多...什么是返回类型中的差异?还有$是什么意思,$()是什么意思? – testndtv 2012-03-13 16:43:21
我重写了我的答案,希望澄清事情。 – HackedByChinese 2012-03-14 01:19:46
心灵吹拂的解释...如果我可以,我会给这1000票... – testndtv 2012-03-14 12:07:55
我不知道如果核心 VS 实用是对比两种方法不对,但我会用它运行。
通常,核心方法对选定的jQuery对象进行操作。
// Loop through selected jQuery objects, operating on each
$('li').each(function(index) {
alert(index + ': ' + $(this).text());
});
实用方法做不直接操作所选择的jQuery对象;而是简单地向开发者提供某种形式的功能或实用程序。它与任何其他JavaScript函数类似。 $
允许它有一个jQuery所熟悉的“伪名字空间”。
// Loop through an array of numbers
$.each([52, 97], function(index, value) {
alert(index + ': ' + value);
});
由于@cleric指出,这chapter在jQuery Fundamentals解释了它的更多细节。
- 1. 调用核心方法
- 2. Xamarin .Net核心HttpClientHandler方法未实现(VS for Mac)
- 3. JavaScript核心方法如何实现?
- 4. jQuery修剪方法的核心代码
- 5. 为什么核心动画方法是类方法而不是实例方法?
- 6. 核心数据willSave:方法
- 7. Laravel核心方法混淆
- 8. 类方法vs实例方法
- 9. 类方法VS实例方法
- 10. Javascript核心ios调用类方法
- 11. spring jstl核心检查方法调用
- 12. EJB方法vs实体方法,谁应该有什么方法?
- 13. 核心数据实体的初始化方法不可用
- 14. 对象方法调用VS类方法调用。最佳实践?
- 15. 扩展核心类比较方法的最佳方法
- 16. Java方法()++ VS方法()+ 1
- 17. 在ASP.NET核心IHttpActionResult和帮手方法
- 18. 核心数据更新方法混淆
- 19. ASP.NET核心HttpRequest类没有BinaryRead方法
- 20. .net核心中缺少方法例外
- 21. URL核心路由的方法php
- 22. 核心数据的多语言方法
- 23. java.lang.System.arraycopy(本地方法)冻结CPU核心
- 24. peripheral.DiscoverCharacteristic方法蓝牙核心 - Xamarin
- 25. ExcelDataReader .Net核心中的GetOrdinal方法
- 26. 可可核心数据有效的方法来统计实体
- 27. 实体框架核心的异步方法失败
- 28. 实体框架核心模型关系的正确方法
- 29. 实体框架的核心:与问题包含方法
- 30. 在Swift中实现核心数据验证方法
这听起来像一个家庭作业问题。这也听起来不像它属于这里。 – 2012-03-13 13:03:24
其实这不是一个家庭作业的问题....我知道这听起来有点理论,但我只是需要实际的例子来了解不同类型的jQuery方法.. – testndtv 2012-03-13 13:08:33
@Ben Barden:他们现在在学校教jQuery?这听起来好像是个好消息,或者真的是坏消息。 – BoltClock 2012-03-13 13:22:51