上一篇主要看了core.js,提到了无 new的构造方式,这一篇就看看这个init里究竟干了什么吧
用法
jQuery()
Return a collection of matched elements either found in the DOM based on passed argument(s) or created by passing an HTML string.
- jQuery( selector [, context ] )
- jQuery( selector [, context ] )
- jQuery( element )
- jQuery( elementArray )
- jQuery( object )
- jQuery( selection )
- jQuery()
- jQuery( html [, ownerDocument ] )
- jQuery( html [, ownerDocument ] )
- jQuery( html, attributes )
- jQuery( callback )
实现
jQuery的代码里,则是分成string, dom, callback来分别处理的
对DOM的操作
对dom的操作,直接将dom在实例的0属性上,设置length,返回即可
对callback的操作
为ready的简写
对HTML string的处理
用正则表达式去提取字符串的信息
(?:pattern): 表示匹配但是不存储\s*:前面的空格(<[\w\W]+>): 匹配标签到结束<div></div>[^>]: 匹配所有不是>的字符#([\w-]*))$: id 表达式
正则表达式exec:
如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 i 个元素是与 RegExpObject 的第 i 个子表达式相匹配的文本(如果有的话)
用match来记录匹配的结果
然后来分析match的结果,我们知道match[1] 对应的是(<[\w\W]+>)(标签)这部分,match[2]对应的是([\w-]*)(id)部分
- 有match[1],那给的是html串,需要对html串,进行解析成一组dom ,与实例合并。如果第二个参数是属性数组,则给实例添加相应的属性或方法。
|
|
- 没有match[1], 有match[2] 说明是id选择器,直接通过
document.getElementById找到元素,然后像对待$(DOMElement)一样处理即可
|
|
- 没有match[1],没有match[2],那就是其他的选择器,在上下文对象上走
find路线
|
|
parseHTML
作用是将字符串转成一组dom节点
用到了一个复杂的正则表达式去匹配单个标签元素的情况
([a-z][^\/\0>:\x20\t\r\n\f]*): 匹配标签的名称,名称含有字母,不含空格,’>’, ‘:’, ‘/‘等[\x20\t\r\n\f]*: 匹配空格、制表符、回车、换行、分页\/?> 可以带/,考虑到<input/>这样的元素(?:<\/\1>|): \1表示捕获的第一个分组,这部分匹配如</div> 或者为空
用正则去匹配字符串,match[1]就是标签名
|
|
代码里对非单个标签的情况下,根据内容去创建文档碎片,然后返回这个碎片
|
|
对碎片处理,分类处理。是dom节点,直接放到nodes里,是文本就创建文本节点,其他的就创建div,将字符串作为innerHTML插入,获取所有的节点,放在nodes里
下面还有一段处理脚本的代码,还没看懂。。。
然后把所有的节点都在到碎片里,并对脚本进行处理,这一段没看懂。。。😅
到这似乎越来越接近sizzle了,但是看到这我都觉得有点费力了,之后可能不按顺序走了,挑点简单的看起。