jQuery源码分析笔记(2)变量列表_jquery
时间:2021-07-01 10:21:17
帮助过:1人阅读
_jQuery = window.jQuery;
_$ = window.$;
这两个变量是jQuery唯一使用的两个全局变量。在jQuery.noConflict()函数中,会把这两个变量恢复回去。
对于浏览器检测,jQuery使用的是检查UserAgent,而没有使用特性检测。
rwebkit = /(webkit)[ \/]([\w.]+)/,
ropera = /(opear)(?:.*version)?[ \/](\w+)/,
rmsie = /(msie) ([\w.]+)/,
rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
初始化函数init
jQuery对JS对象的处理比较绕,而最终目的就是把jQuery选择器得到的结果变成和数组差不多的一个对象。有length,first,last等。因为$("...")就是从DOM树从选择一些节点出来。但是,$还有很多其他功能,比如常用的$(function() { ... })用来页面加载后初始化执行,$("<..>...")来直接得到一个节点,用来append到DOM树中。
接下来从93行开始就是很长的一段init函数。Init: function(selector, context, rootjQuery)
步骤:
1、Selector是非法参数:空字符,null和undefined则直接返回this。即有默认属性的jQuery对象。
2、Selector是DOMElement。即用原生的JS,比如getElementById等得到的元素。那么,相当于把原生的DOM对象用$包装一次。把这个元素放到内部数组的第一个位置,并把length设置为1。然后返回。
3、特殊优化处理$("body")。即document.body元素。
4、Selector是以<开头,以>结尾的字符串。那么假定是想用字符串新建一个DOM元素。比如$("博客园")。为了安全起见,这里使用了一个正则表达式来检查,到底是<...>...形式还是#id的形式。
quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/。在quickExpr.exec(selector)后,如果是HTML字符串,那么会得到[match, match, undefined],而#id形式会得到[#id, undefined, id]的结果。这样就把字符串区别开了。
对于HTML字符串,如果只有一个tag,那么直接调用createElement。否则调用一个createFragment辅助函数,这个函数使用createDocumentFragment,然后把所有tag都插进去。
createFragment实现在5892行,这里有一个值得注意的地方就是jQuery对于HTML片段做了缓存处理。而且对于不同的浏览器和元素有不同的处理,作者写了大段的注释说明。归纳起来就是(1)只缓存小于0.5KB的小片段。(2)selected状态不缓存。(3)IE6的