Anyone who has never made a mistake has never tried anything new.
— Einstein
Anyone who has never made a mistake has never tried anything new.
原文:18 Surprises From Reading jQuery's Source Code(2014-7-23)
我热爱 jQuery,且尽管我认为自己算是一名高级 JavaScript 开发者,我从来没有试过由头到尾把 jQuery 的源码看一遍,直到现在。这里分享一些我一路下来学到的东西:
注意:我使用 $.fn.method()
语法来表示调用一组匹配元素的方法。比如当我说 $.fn.addClass
,则表示 $('div').addClass('blue')
或者 $('a.active').addClass('in-use')
此类的用法。$.fn
是 jQuery 包装元素的原型。
$('div.active')
转换成可操作的元素数组。我知道 Sizzle 占了 jQuery 相当大的部分,但它的庞大还是吓到了我。按行数来说它很无疑是 jQuery 中唯一最庞大的特性。我估计它占了总代码库的 22%,而第二大的特性—— $.ajax
只占了 8%。_.filter
类似。接受两个参数,一个元素数组和一个函数,对每个元素依次执行函数,返回执行结果为 true 的元素数组。load
事件冒泡。从内部看,jQuery 在所有的 load
事件中传入特殊的 noBubble: true
标记,所以 image.load
事件才不会冒泡到 window
上错误地触发 window.load
事件。tick
。默认动画速度是每13毫秒运行一次 tick
,要改变速度你可以重写 jQuery.fx.interval
成你想要的整数。$.fn.addClass
提供一个包含类名的字符串来创建元素。但它也可以接受一个函数。这个函数必须返回一个字符串,多个类名间要以空格隔开。这里还有个彩蛋,这个函数接受已匹配元素的索引作为参数,你可以用这个特性来构造智能变化的类名。$('div:gt(2)')
会返回所有的 div
,除了前三个(从0开始)。如果你传入一个负数,它会倒过来从尾开始数。$(document).ready()
使用了一个 jQuery 延迟来确定 DOM 在什么时候完全加载。typeof
来确定数据类型,但你知不知道 jQuery 提供了一个 .type()
方法?jQuery 版比原生版更加智能。比如 typeof (new Number(3))
返回 object
,而 $.type(new Number(3))
则返回 number
。更新:正如 ShirtlessKirk 在评论中指出,$.type
返回其对象的 .valueOf()
属性。所以更准确的说法应该是 $.type
告诉你一个对象的返回值的类型。$(‘div’).queue()
查看一个元素的效果队列,很方便地了解元素还剩余多少效果。更有用的是,你可以直接操作队列去添加效果。从 jQuery 文档摘录的:$( 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();
});
click
事件,有了这个优化,你无需自己用代码再检查一遍。$.fn.on
可以接受一个对象来一次过连接多个事件吗?jQuery 文档的例子:$( "div.test" ).on({
click: function() {
$( this ).toggleClass( "active" );
}, mouseenter: function() {
$( this ).addClass( "inside" );
}, mouseleave: function() {
$( this ).removeClass( "inside" );
}
});
$.active
返回 XHR (XML Http Request) 查询的个数。利用它可以手动制定 AJAX 请求的并发上限。.parents()
、.next()
和 .prev()
,却不知道原来还有其它的方法。它们会匹配所有的 双亲/下一个/前一个 元素直到(until)遇到符合终止条件的元素。.clone()
克隆一个元素,你可以用 true
作为第一个参数来克隆该元素的数据属性(data attributes)和事件。true
参数来克隆该元素所有孩子的数据属性和事件。这叫做“深克隆”。第二个参数的默认值与第一个一样(第一个默认false)。所以当第一个参数是 true
而你想让第二个参数也是 true
时,完全可以忽略第二个参数。评论没有加载,检查你的局域网
Cannot load comments. Check you network.