jQuery.fn.init(selector, context, rootjQuery)
构造函数 jQuery.fn.init() 负责解析参数 selector 和 context 的类型, 并执行相应的逻辑, 最后返回 jQuery.fn.init() 的实例.
解析参数 selector 和 context 公有 12 个有效分支

源码分析
定义 jQuery.fn.init(selector, context, rootjQuery)
1 | jQuery.fn = jQuery.prototype = { |
在 init() 构造函数定义中接受三个参数 selector、context、rootjQuery
- selector: 可以是任意类型的值, 但只有 undefined、DOM 元素、字符串、函数、jQuery 对象、普通 JavaScript 对象这几种类型有效
- context: 可以不传入, 或者传入 DOM 元素、jQuery 对象、普通 JavaScript 对象之一
- rootjQuery: 包含了 document 对象的 jQuery 对象, 用于 document.getElementById()查找失败、selector 是选择器表达式且未指定 context、selector 是函数的情况.
rootjQuery 定义与应用场景
1 | // document.getElementById() 查找失败 |
参数 selector 可以转换为 false
参数 selector 可以转换为 false, 例如: undefined、空字符串、null 等, 则直接返回 this, 此时 this 是空 jQuery 对象, 其属性 length 等于 0.
1 | // Handle $('')、$(null) or $(undefined) |
参数 selector 是 DOM 元素
如果参数 selector 有属性 nodeType, 则认为 selector 是 DOM 元素, 手动设置第一个元素和属性 context 指向该 DOM 元素、属性 length 为 1, 然后返回包含了该 DOM 元素引用的 jQuery 对象
1 | // Handle $(DOMELement) |
参数 selector 是字符串 ‘body’
如果参数 selector 是字符串 “body”, 手动设置属性 context 指向 document 对象、第一个元素指向 body 元素、属性 length 为 1, 最后返回包含了 body 元素引用的 jQuery 对象
1 | // The body element only exists once, optimize finding it |
参数 selector 是其他字符串
如果参数 selector 是其他字符串, 则先检测 selector 是 HTML 代码还是 #id.
1 | // 处理参数是字符串 |
如果 selector 是单独标签
如果 selector 是单独标签, 就调用 document.createElement() 创建标签对应的 DOM 元素
1 | /** |
之所以把创建的 DOM 源码放入数组中, 是为了后面方便的调用 jQuery.merge() 方法, 此方法用于合并两个数组的元素到一个数组
参数 selector 是复杂 HTML 代码
如果参数 selector 是复杂 HTML 代码, 则利用浏览器 innerHTML 创建 DOM 元素
1 | { |
如果参数 selector 是 #id, 且未指定参数 context
如果参数 selector 是 #id, 且未指定参数 context, 则调用 document.getElementById() 查找含有指定 id 属性的 DOM 元素
1 | { |
参数 selector 是选择器表达式
1 | // HANDLE: $(expr, $(...)) |
参数 selector 是函数
1 | // 如果是函数 就绑定 ready 事件 |
如果参数 selector 是 jQuery 对象
1 | // 如果参数包含 selector 就认为是 jQuery 对象 |
参数 selector 是任意其他值
1 | /** |
总览
