我喜欢jQuery,虽然我认为自己是一名高级JavaScript开发人员,但我从未尝试过从头到尾阅读jQuery的源代码,直到现在。以下是我在此过程中学到的一些东西:注意:我使用$.fn.method()语法表示对一组匹配元素调用方法。例如,当我说$.fn.addClass时,它表示$('div').addClass('blue')或$('a.active').addClass('in-use')。$.fn是jQuery包装器元素的原型。1、Sizzle的权重:Sizzle是jQuery用来在DOM中查找元素的选择器引擎,基于CSS选择器。它将$('div.active')转换为可以操作的元素数组。我知道Sizzle是jQuery的重要组成部分,但它的庞大规模仍然让我感到害怕。就行数而言,它很容易成为jQuery中最大的功能。我估计它占整个代码库的22%,而第二大功能-$.ajax-只占8%。2.$.grep:这个方法类似于Underscore的_.filter。接受两个参数,一个元素数组和一个函数,依次对每个元素执行函数,返回执行结果为真的元素数组。3、禁止冒泡:jQuery明确禁止load事件冒泡。在内部,jQuery在所有加载事件中传递特殊的noBubble:true标志,因此image.load事件不会冒泡到窗口并错误地触发window.load事件。4.默认动画速度:jQuery通过快速连续改变样式属性来动画元素。每个小的变化都称为一个滴答声。默认动画速度是每13毫秒运行一次滴答声,要更改速度,您可以将jQuery.fx.interval重写为您想要的整数。5.fn.addClass可以接受函数:我们通常为$.fn.addClass提供一个包含类名的字符串来创建元素。但它也可以接受一个函数。该函数必须返回一个字符串,多个类名之间用空格分隔。这里还有一个彩蛋,这个函数接受匹配元素的索引作为参数,你可以利用这个特性构造智能变化的类名。6.fn.removeClass同理:同上,也可以接受一个函数。此函数还自动接收元素的索引。7.:empty伪选择器:可以方便的用来匹配没有子元素的元素。8.:lt和:gt伪选择器:它们根据元素在匹配集合中的索引来匹配元素。例如$('div:gt(2)')将返回除前三个(从0开始)以外的所有div。如果你传入一个负数,它会从末尾开始倒数。9.$(document).ready()的承诺:jQuery似乎在使用它自己的东西。在内部,可信赖的$(document).ready()使用jQuery延迟来确定DOM何时完全加载。10、$.type:想必大家都会熟练使用typeof来判断数据类型,但是你知道jQuery提供了.type()方法吗?jQuery版本比原生版本更智能。例如,typeof(newNumber(3))返回对象,而$.type(newNumber(3))返回数字。更新:正如ShirtlessKirk在评论中指出的那样,$.type返回其对象的.valueOf()属性。所以更准确的说法应该是$.type告诉你一个对象的返回值的类型。11、$.fn.queue:可以通过$('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();});12、被禁用的元素不会触发点击事件:jQuery默认不会对被禁用的元素执行点击事件。通过此优化,您无需再次检查代码。13.$.fn.on可以接受对象:你知道$.fn.on可以接受一个对象来一次连接多个事件吗?来自jQuery文档的示例:$("div.test").on({click:function(){$(this).toggleClass("active");},mouseenter:function(){$(this).addClass("里面");},mouseleave:function(){$(this).removeClass("里面");}});14.$.camelCase:这个有用的方法将带连字符的字符串转换为camelCase类型的字符串。15、$.active:调用$.active返回XHR(XMLHttpRequest)查询次数。可用于手动设置AJAX请求的并发上限。16.$.fn.parentsUntil/$.fn.nextUntil/$.fn.prevUntil:我比较熟悉的是.parents(),.next()和.prev(),但是不知道还有其他的方法。它们将匹配所有父/下/前元素,直到(直到)遇到匹配终止条件的元素。17、$.fn.clone参数:当你使用.clone()克隆一个元素时,你可以使用true作为第一个参数来克隆该元素的数据属性(dataattributes)和事件。18、更多的$.fn.clone参数:除了上述方法外,还可以额外传入一个true参数,克隆该元素所有子元素的数据属性和事件。这称为“深度克隆”。第二个参数的默认值与第一个相同(第一个默认为false)。所以当第一个参数为真而你又想让第二个参数为真时,完全可以忽略第二个参数。本文由伯乐在线-JawardHuaTsai翻译自quickleft
