注释:本文使用$.fn.method指代调用一系列选中的元素的方法。例如,$.fn.addClass,指代$('div').addClass(‘blue’) 或 $('a.active’).addClass(‘in-use’)这些用法。$.fn指代jQuery对象。

1.Sizzle’s weight:Sizzle 是jQuery基于CSS选择器的DOM查找引擎。它可以将$(‘div.active’)转换成一个可操作的元素数组。Sizzle是jQuery很大的一个组成部分,但是它的规模之大的确令人惊讶。在jQuery源码中它无疑是最大的独立模块。计算了一下,它在所有代码中占了22%。这使得jQuery中的第二大的模块-占据源码的8%的$.ajax,显得很小。

2.$.grep:这个方法至少有两个参数,一个元素数组和一个函数,返回通过过滤的元素。

3.Bubbling caveats:jQuery特别阻止了一类事件的冒泡。就是load事件。本质上讲,jQuery传递了一个特别的noBubble:true标志位给任何的load事件,所以image.load事件不冒泡到window(有可能被误认为成window.load事件).

4.Default animation speed:jQuery通过连续不断的改变元素的样式属性来实现元素的动画。每一个改变称之为“tick”.默认的动画速度是每13毫秒进行一个“tick”,可以通过使用自己定义的整数值重写jQuery.fx.interval来调整这个速度。

5.$.fn.addClass accepts a function:我们通常提供给$.fn.addClass一个类名字符串来将它添加给一个元素。但它也可以接受一个函数。从这个函数中必须返回一个类名字符串将它们提供给相关元素。这个函数额外的接受关联元素的索引值作为一个参数,可以用它来建立智能的类名。

6.So does $.fn.removeClass:这个方法也可以接受函数,与上面提到的方法类似。这个函数也可以自动接收元素的索引值。

7.:empty pseudo selector:这个方便的伪类选择器可以选择没有子元素的节点。

8.:lt and :gt pseudo selectors:这些方便使用的伪类选择器通过设置的索引值来匹配元素。例如,$('div:gt(2)’)会返回除前三个的所有div元素(从0开始计数)。如果传一个负整数参数,它从后面开始计数。

9.$(document).ready() uses a promise:jQuery吃自己的狗粮,就类似这样。本质上讲,可信任的$(document).ready()使用了jQuery的deferred来确认DOM完全加载。

10.$.type:我确定我们都很熟悉用typeof来判断一个数据的类型,但你知道jQuery提供了一个.type()方法吗?jQuery的版本比浏览器本地的版本更智能。例如,typeof (new Number(3))返回"object",然而$.type(new Number(3))返回"number".更新下:正如ShirtlessKirk在评论中所说,$.type返回接收对象.valueOf()属性的类型。更精确的说,$.type告诉你一个对象返回的值。

11.$.fn.queue:可以通过下面的例子来观察下元素的效果队列:$(‘div’).queue().如果需要知道元素保留有多少效果,这个很有用。更有用的,可以直接操作队列来添加自己的效果。

$( document.body ).click(function() {
$( "div" )
.show( "slow" )
.animate({ left: "+=200" }, 2000 )
.queue(function() {
$( this ).addClass( "newcolor" ).dequeue();
})
.animate({ left: "-=200" }, 500 )
.queue(function() {
$( this ).removeClass( "newcolor" ).dequeue();
})
.slideUp();
});

12.Click events prohibited on disabled elements:jQuery自动不处理被禁用的元素的click事件,这是一个很棒的优化。

13.$.fn.on accepts an object:你知道$.fn.on接收一个对象来一次性连接多个事件吗?可以看个例子:

$( "div.test" ).on({
click: function() {
$( this ).toggleClass( "active" );
}, mouseenter: function() {
$( this ).addClass( "inside" );
}, mouseleave: function() {
$( this ).removeClass( "inside" );
}
});

14.$.camelCase:这个实用的方法将dashed-strings字符串转换成camelCased字符串。

15.$.active:调用$.active返回活跃的XHR的数量。这个在限制一次最多允许多少活跃的AJAX请求上会有用。

16.$.fn.parentsUntil / $.fn.nextUntil / $.fn.prevUntil:我对于.parents(), .next(), 和 .prev()方法很熟悉,但不知道有其他的版本。本质上,他们会匹配所有父元素、后元素、前元素直到他们遇到停止条件元素。

17$.fn.clone arguments:当.clone()元素时,你也可以通过传递true作为clone的第一个参数来克隆它的数据属性和事件。

18.More $.fn.clone arguments:除了上面提到的,也可以通过传递一个附加的true参数克隆它的子节点的数据属性和和事件。这被称为深克隆。第二个参数默认是第一个参数的值(默认false)。所以如果第一个参数是true,第二个也需要设置为true,可以完全省略第二个参数。

英文原文:http://quickleft.com/blog/18-surprises-from-reading-jquery-s-source-code

阅读jQuery源码的18个惊喜的更多相关文章

  1. 阅读jquery源码与js依赖加载的模块化!

    阅读源码肯定是先下载有注释的源码 我也是醉了,10309 行代码,在陆续续的一个月之内,看完了,虽有收获但收获不大, 直到又一次看jquery的github,怎么会有cmd????没听过使用jquer ...

  2. 【jQuery源码】jQuery对象初始化

    看了一下午还是有很多地方没弄明白,jQuery的一些工具方法的原理也不完全清楚,这篇文章会随着我深入阅读jQuery源码的同时不断更新. // Initialize a jQuery object / ...

  3. jQuery源码分析之整体框架

    之前只是知道jQuery怎么使用,但是我觉得有必要认真的阅读一下这个库,在分析jQuery源码之前,很有必要对整个jQuery有个整体的框架概念,才能方便后面对jQuery源码的分析和学习,以下是我总 ...

  4. jQuery源码:从原理到实战

    jQuery源码:从原理到实战 jQuery选择器对象 $(".my-class"); document.querySelectorAll*".my-class" ...

  5. jquery源码分析学习地址

    http://www.ccvita.com/121.htmljQuery工作原理解析以及源代码示例http://www.cnblogs.com/haogj/archive/2010/04/19/171 ...

  6. jquery 源码分析学习地址

    http://www.ccvita.com/121.htmljQuery工作原理解析以及源代码示例http://www.cnblogs.com/haogj/archive/2010/04/19/171 ...

  7. js菜鸟进阶-jQuery源码分析(1)-基本架构

    导读: 本人JS菜鸟一枚,为加强代码美观和编程思想.所以来研究下jQuery,有需要进阶JS的同学很适合阅读此文!我是边看代码(jquery2.2.1),边翻“javascript高级程序设计”写的, ...

  8. jquery源码解读

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能 ...

  9. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

随机推荐

  1. Jquery Validation 插件验证手机号

    自定义手机号验证代码  http://www.2cto.com/kf/201505/402781.html // 手机号码验证 jQuery.validator.addMethod("isM ...

  2. 设置Linux下Mysql表名不区分大小写

    1.Linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写:2.用root帐号登录后,在/etc/my.cnf中的[mysqld]后添加添加lower_case_table_nam ...

  3. compass项目监控文件报 /usr/bin/env 找不到文件

    1 找到ruby执行文件目录 $ wherris ruby ruby: /usr/lib/ruby /home/rudy/.rbenv/shims/ruby 2 设置软链接 sudo ln -s /h ...

  4. PXE批量部署linux操作系统

    前言 在实际生产环境中,有时候我们会碰到为几十上百甚至上千台服务器安装Linux操作系统的需求,如果我们还是常规的去使用移动介质逐台安装,显然是一件低效又令人抓狂的事情,那要安装到何年何月啊?这对于我 ...

  5. [ActionScript 3.0] AS3实现图像径向转旋效果

    原图    效果     import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Blen ...

  6. zookeeper 监控 —— 阿里taokeeper

    TaoKeeper是一个围绕ZooKeeper做的监控与报表系统. 主要功能如下: 能够统计ZK集群连接数,Watcher数目 ,节点数等系列信息,并按一定规则进行一些聚合操作; 能够通过设置一些阈值 ...

  7. java类总结

    1.java类与类之间存在六种关系:继承,实现,依赖,关联,聚合组成 2.一个类可以继承另外一个类,并在此基础上添加自己的特有的功能. 3.一个类的方法中操作另外一个类的对象,这种情况称为第一个类依赖 ...

  8. Android中通过广播方式调起第三方App

    今天紧急的跟进一个百度视频App无法调起百度贴吧App的问题,当然,这个是只发现是在4.x的android系统下发生,在2.x版本下,一切正常,(其实是3.1及以上的版本都有问题)具体场景为: 1.贴 ...

  9. php 获取图片主要颜色的方法

    本文章向码农们介绍php 获取图片主要颜色的方法,主要涉及php针对图片的相关操作技巧,需要的码农可以参考一下. $i = imagecreatefromjpeg("image.jpg&qu ...

  10. Caught exception while loading file struts-default.xml 错误

    严重: Exception starting filter struts2 Caught exception while loading file struts-default.xml - [unkn ...