Skip to content

Commit bd4b401

Browse files
committed
选择器使用
1 parent 5f82ba7 commit bd4b401

File tree

6 files changed

+246
-4
lines changed

6 files changed

+246
-4
lines changed

image/2019-09-04_111259.png

23.6 KB
Loading

image/2019-09-04_112019.png

13.2 KB
Loading

image/2019-09-04_112444.png

11.6 KB
Loading

jQuery整体架构/专题一第二章jQuery/2.2.1jQuery选择器/demo.html

+1-3
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@
66
</head>
77
<body>
88
<div id="box"></div>
9-
<script src="jQuery.1.0.1.js"></script>
9+
<script src="./jQuery.1.0.2.js"></script>
1010
<script>
1111
console.log($("<a>")) //创建DOM
12-
console.log($("#box"))
13-
console.log($(document))
1412
</script>
1513
</body>
1614
</html>

jQuery整体架构/专题一第二章jQuery/2.2.1jQuery选择器/jQuery.1.0.2.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@
2727
if (typeof selector === "string") {
2828
if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) {
2929
match = [selector]
30+
console.log(match,1)
3031
}
3132
//创建DOM
3233
if (match) {
3334
//this
35+
console.log(this)
3436
jQuery.merge(this, jQuery.parseHTML(selector, context));
3537
//查询DOM节点
3638
} else {
@@ -148,7 +150,7 @@
148150
}
149151

150152
first.length = i;
151-
153+
console.log(first,2)
152154
return first;
153155
},
154156

jQuery源码文档/02选择器.md

+242
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
# 选择器
2+
3+
* 常用的jQuery选择器接口
4+
5+
* 选择器接口源码解析
6+
7+
> jQuery对象和DOM对象区别
8+
9+
DOM对象 | jQuery对象
10+
------------ | -------------
11+
是由宿主环境提供的对象.在文档对象模型中,每个部分都是节点 如:所有的HTML元素节点,而element对象表示HTML元素 | jQuery构造函数创建出来的对象 通过jQuery选择器可以获取HTML的元素,并且以一种类数组的形式存储在jQuery对象中
12+
13+
> 错误的用法与对象转换
14+
15+
`````JavaScript
16+
//错误用法示例代码
17+
$('div').innerHTML
18+
//错误用法示例代码
19+
document.getElementsByTagName('div')[0].html()
20+
//Element对象转换成jQuery对象
21+
var domObj = document.getElementById('id');
22+
var $obj - $(domObj);//jQuery对象
23+
//jQuery对象转换成Element对象
24+
var $box = $('.box')
25+
var box = $box[0]
26+
`````
27+
28+
> 常用的jQuery选择器接口
29+
30+
````javaScript
31+
//传入对象
32+
$(this)
33+
$(document)
34+
把传入的对象包装成jQuery对象
35+
//传入函数
36+
$(function(){})
37+
这个是在也买你DOM文档加载完成后在家执行的,等效于在DOM加载完毕后执行$(document).ready()方法
38+
//传入字符串
39+
$(".box")
40+
查找DOM节点包装成jQuery对象
41+
//
42+
$()
43+
创建jQuery对象
44+
````
45+
46+
47+
48+
>jQuery示例对象length属性的作用
49+
50+
> merge方法的应用场景有哪些
51+
52+
> $(document).ready() 于$(function(){})的关系
53+
54+
````html
55+
<!DOCTYPE html>
56+
<html>
57+
<head>
58+
<meta charset="utf-8">
59+
<title></title>
60+
</head>
61+
<body>
62+
<div id="box"></div>
63+
<script src="jQuery.1.0.1.js"></script>
64+
<script>
65+
console.log($("<a>")) //创建DOM
66+
console.log($("#box")) //查找
67+
console.log($(document))//创建
68+
</script>
69+
</body>
70+
</html>
71+
````
72+
> 如何把创建的DOM节点包装成jQuery对象?
73+
![创建Dom节点](../image/2019-09-04_111259.png)
74+
![marge方法](../image/2019-09-04_112019.png)
75+
![parseHtml](../image/2019-09-04_112444.png)
76+
````JavaScript
77+
// 调用$("<a>") 其实实在调用 jQuery的init方法
78+
(function(root) {
79+
var testExp = /^\s*(<[\w\W]+>)[^>]*$/;
80+
var rejectExp = /^<(\w+)\s*\/?>(?:<\/\1>|)$/;
81+
var version = "1.0.1";
82+
var jQuery = function(selector, context) {
83+
return new jQuery.prototype.init(selector, context);
84+
}
85+
86+
jQuery.fn = jQuery.prototype = { //原型对象
87+
length: 0,
88+
jquery: version,
89+
selector: "",
90+
init: function(selector, context) {
91+
context = context || document;
92+
var match, elem, index = 0;
93+
//$() $(undefined) $(null) $(false)
94+
if (!selector) {
95+
return this;
96+
}
97+
98+
if (typeof selector === "string") {
99+
if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) {
100+
match = [selector]
101+
console.log(match,1)
102+
}
103+
//创建DOM
104+
if (match) {
105+
//this
106+
console.log(this)
107+
jQuery.merge(this, jQuery.parseHTML(selector, context));
108+
//查询DOM节点
109+
} else {
110+
elem = document.querySelectorAll(selector);
111+
var elems = Array.prototype.slice.call(elem);
112+
this.length = elems.length;
113+
for (; index < elems.length; index++) {
114+
this[index] = elems[index];
115+
}
116+
this.context = context;
117+
this.selector = selector;
118+
}
119+
} else if (selector.nodeType) {
120+
this.context = this[0] = selector;
121+
this.length = 1;
122+
return this;
123+
}
124+
125+
},
126+
css: function() {
127+
console.log("di~~didi~~")
128+
},
129+
//....
130+
}
131+
132+
jQuery.fn.init.prototype = jQuery.fn;
133+
134+
135+
jQuery.extend = jQuery.prototype.extend = function() {
136+
var target = arguments[0] || {};
137+
var length = arguments.length;
138+
var i = 1;
139+
var deep = false; //默认为浅拷贝
140+
var option;
141+
var name;
142+
var copy;
143+
var src;
144+
var copyIsArray;
145+
var clone;
146+
147+
if (typeof target === "boolean") {
148+
deep = target;
149+
target = arguments[1];
150+
i = 2;
151+
}
152+
153+
if (typeof target !== "object") {
154+
target = {};
155+
}
156+
157+
if (length == i) {
158+
target = this;
159+
i--; //0
160+
}
161+
162+
for (; i < length; i++) {
163+
if ((option = arguments[i]) !== null) {
164+
for (name in option) {
165+
src = target[name];
166+
copy = option[name];
167+
if (deep && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
168+
if (copyIsArray) {
169+
copyIsArray = false;
170+
clone = src && jQuery.isArray(src) ? src : [];
171+
} else {
172+
clone = src && jQuery.isPlainObject(src) ? src : {};
173+
}
174+
target[name] = jQuery.extend(deep, clone, copy);
175+
} else if (copy !== undefined) {
176+
target[name] = copy;
177+
}
178+
}
179+
}
180+
}
181+
return target;
182+
}
183+
184+
185+
jQuery.extend({
186+
//类型检测
187+
isPlainObject: function(obj) {
188+
return typeof obj === "object";
189+
},
190+
191+
isArray: function(obj) {
192+
return toString.call(obj) === "[object Array]";
193+
},
194+
195+
isFunction: function(fn) {
196+
return toString.call(fn) === "[object Function]";
197+
},
198+
//类数组转化成正真的数组
199+
markArray: function(arr, results) {
200+
var ret = results || [];
201+
if (arr != null) {
202+
jQuery.merge(ret, typeof arr === "string" ? [arr] : arr);
203+
}
204+
return ret;
205+
},
206+
207+
//合并数组
208+
merge: function(first, second) {
209+
var l = second.length,
210+
i = first.length,
211+
j = 0;
212+
213+
if (typeof l === "number") {
214+
for (; j < l; j++) {
215+
first[i++] = second[j];
216+
}
217+
} else {
218+
while (second[j] !== undefined) {
219+
first[i++] = second[j++];
220+
}
221+
}
222+
223+
first.length = i;
224+
225+
return first;
226+
},
227+
228+
parseHTML: function(data, context) {
229+
if (!data || typeof data !== "string") {
230+
return null;
231+
}
232+
//过滤掉<a> <a> => a
233+
var parse = rejectExp.exec(data);
234+
console.log(parse)
235+
return [context.createElement(parse[1])];
236+
},
237+
});
238+
239+
root.$ = root.jQuery = jQuery;
240+
})(this);
241+
````
242+

0 commit comments

Comments
 (0)