我们接着上一篇博客继续完成zepto.init
的其余内容。
基于Zepto 1.2.0版本。
代码挂在我的github上,第一篇博客对应文件夹v0.2。
https://github.com/zrysmt/DIY-zepto
整体的流程是:
- 有传入context,回调自身:
$(context).find(selector)
- selector参数为空,直接调用$.zepto.Z方法获取Z对象:
zepto.Z()
- selector参数为html片段,调用$.zepto.fragment方法获取对应DOM节点再调用$.zeptoZ方法获取Z对象
- selector参数为css选择器,调用$.zepto.qsa方法获取对应DOM节点再调用$.zepto.Z方法获取Z对象
- selector参数为DOM节点数组,去掉数组中值为null的项,调用$.zepto.Z方法获取Z对象
- selector参数为单个DOM节点,
dom = [selector]
,然后调用$.zepto.Z方法获取Z对象 - selector参数为Z对象,直接返回该Z对象
- selector参数为函数,执行
$(document).ready(selector)
,在DOM加载完的时候调用该函数
整体代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39zepto.init = function(selector, context) {
var dom;
//未传参,返回空Zepto对象
if (!selector) {
console.log("未传参数");
return zepto.Z();
} else if (typeof selector == 'string') {
selector = selector.trim();
//如果是“<>”,基本的html代码时
if (selector[0] == '<' && fragmentRE.test(selector)) {
console.log(selector, RegExp.$1);
//调用片段生成dom
dom = zepto.fragment(selector, RegExp.$1, context), selector = null;
} else if (context !== undefined) {
return $(context).find(selector);
} else {
dom = zepto.qsa(document, selector)
}
} //如果selector是个函数
else if (isFunction(selector)) {
return $(document).ready(selector);
} //如果selector是一个Zepto对象,返回它自己
else if (zepto.isZ(selector)) {
return selector;
} else {
if (isArray(selector)) {
dom = compact(selector);
} else if (isObject(selector)) {
dom = [selector], selector = null;//单个DOM
} else if (fragmentRE.test(selector)) {
dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null;
} else if (context !== undefined) {
return $(context).find(selector);
} else {
dom = zepto.qsa(document, selector);
}
}
return zepto.Z(dom, selector);
}
1.上下文查找
关键一步是$(context).find(selector);
,通过find函数查找(1.5
部分)。
1 | <div id="foo1"> |
1.1 工具及变量
1 | //清除包含的null undefined |
1.2 filter方法
1 | $.fn = { |
1.3 not、forEach方法
1 | $.fn = { |
1.4 matches方法
1 | /** |
1.5 find方法
1 | $.fn = { |
这部分会使用发daomap
函数,这里给出代码$.fn
中:1
2
3
4
5map: function(fn) {
return $($.map(this, function(el, i) {
return fn.call(el, i, el);
}));
}
1 | $.map = function(elements, callback) { |
1 | //得到一个数组的副本 |
2.selector是函数(DOMReady机制)
zepto.init
中
1 | if (isFunction(selector)) { |
1 | var readyRE = /complete|loaded|interactive/; |
$.fn
函数里面
1 | ready: function(callback) { |
其实这里由于不考虑兼容IE10以下版本,所以写的比较简单。详细的介绍可以看我的另外的一片博客【domReady机制探究及DOMContentLoaded研究】。
这里的document.readyState
顺序是:loading–>interactive(触发监听DOMContentLoaded的函数)【DOM解析完成】–>compelete【资源完成】。
ready
就是为了保证回掉函数callback
在onload
之前执行。
第一篇博客选择符是html片段的时候,还剩下当第三个参数properties带有属性的时候没有处理。
3. 创建DOM时候带有属性
用法例如1
$('<div></div>',{width:'100px'})
- 工具函数/变量
1 | var methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset']; |
在zepto.fragment
中
1 | zepto.fragment = function(html, name, properties) { |
其中methodAttributes方法的源码实现,我们以后再具体介绍,到此为止zepto.init
已经基本介绍结束了,接下来我们将另外写一篇博客看看zepto里面操作DOM的具体方法。
参考阅读: