引言
jQuery 主要解决两个问题:
- 对DOM节点进行操作。
- 发送Ajax请求并解析响应。
操作DOM节点之前,首先需要选中节点,这一篇我们来研究和节点选择器相关的代码。
init.js
片段一
在上一篇我们提到,在生成jQuery.fn.init实例时,通过解析传入的selector参数,根据不同的selector形式,生成相应的jQuery object,那么背后的代码具体是如何实现的呢?
1 | init = jQuery.fn.init = function( selector, context, root ) { |
构造函数接收selector, context 和 root三个参数,context通常是一个DOM element,如果为空的话则是document, root通常是document。
如果传入的selector为空,则不作任何处理直接返回jQuery object。
片段二
1 | // Handle HTML strings |
首先处理的是selector为html string的情况,相应的match变量不为空:
1 | if ( match && ( match[ 1 ] || !context ) ) { |
在这种情况下,调用jQuery.parseHTML()方法来解析传入的html string,生成一组DOM节点,并调用jQuery.merge()方法,将这组DOM节点插入jQuery object。
片段三
1 | // HANDLE: $(#id) |
当传入的string是#id格式时,直接调用JavaScript原生的getElementById方法获取DOM节点,并将其插入jQuery object。
片段四
1 | // HANDLE: $(expr, $(...)) |
如果selector字符串是表达是形式,则调用find函数处理。根据selector.js及selector-sizzle中的定义: jQuery.find = Sizzle;, find函数调用Sizzle引擎,来解析selector, 关于Sizzle引擎的原理可以参考其官方文档,本文限于篇幅就不作展开了。
可以从jQuery官方文档获得完整的selector形式列表,其中的绝大部分是通过Sizzle引擎支持的。
片段五
1 | // HANDLE: $(DOMElement) |
这里处理的是selector为DOMElement的情形,比较简单,直接将DOMElement插入jQuery object。
片段六
1 | // HANDLE: $(function) |
这里处理的是一个特殊情况,对于简写形式$(function),调用其完整版函数document.ready(function)。