本文将手把手逐渐实现一个简化版的 JQuery

先来自己动手简化选择器

base 是一个对象,拥有两个方法,方法名为 $$$,功能分别为通过 idclass 来获取元素。

1
2
3
4
5
6
7
8
9
10
11
12
var base = {
$:function(id){
return document.getElementById(id);
},
$$:function(className){
return document.getElementsByClassName(className);
}
}

//使用
base.$("id"); //返回相应的元素对象
base.$$("class"); //返回相应的元素对象集合

进阶,向JQuery靠拢

声明一个全局方法 $,用于返回一个 base 对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var $ = function(){
return new Base();
}
function Base(){
this.$ = function(id){
return document.getElementById(id);
};

this.$$ = function(className){
return document.getElementsByClassName(className);
};
}

//使用
$().$("id"); //返回相应的元素对象
$().$$("class"); //返回相应的元素对象集合

加上css方法

增加 css 方法,就可以通过 el.css().css() 链式调用的形式给元素增加样式。

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
var $ = function(){
return new Base();
}
function Base(){
this.elements = [] //创建一个数组,来保存获取的节点和节点数组

this.$ = function(id){
//因为每一次使用$都会新建对象,所以不需要清空,不会异常
this.elements.push(document.getElementById(id));
return this; //一定要返回对象,不然无法进行连缀
};

this.$$ = function(className){
var clss = document.getElementsByClassName(className);
for(var i = 0 ;i < clss.length; i++){
this.elements.push(clss[i]);
}
return this;
};

this.css = function(attr,val){
for(var i = 0;i < this.elements.length; i++){
this.elements[i].style[attr] = val;
}
return this;
}
}

//使用
$().$("id").css("color","white").css("background","black"); //返回相应的元素对象
$().$$("class").css("color","red").css("border","1px dotted black"); //返回相应的元素对象集合

加上eq方法

用于遍历元素,添加一个 current 变量即可

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
39
40
var $ = function(){
return new Base();
}
function Base(){
this.elements = []; //创建一个数组,来保存获取的节点和节点数组
this.current = -1; //用于遍历

this.$ = function(id){
//因为每一次使用$都会新建对象,所以不需要清空,不会异常
this.elements.push(document.getElementById(id));
return this; //一定要返回对象,不然无法进行连缀
};

this.$$ = function(className){
var clss = document.getElementsByClassName(className);
for(var i = 0 ;i < clss.length; i++){
this.elements.push(clss[i]);
}
return this;
};

this.eq = function(index){
this.current = index;
return this;
}

this.css = function(attr,val){
if(this.current != -1)this.elements[this.current].style[attr] = val;
else{
for(var i = 0;i < this.elements.length; i++){
this.elements[i].style[attr] = val;
}
}
return this;
}
}

//使用
$().$("id").css("color","white").css("background","black"); //返回相应的元素对象
$().$$("class").eq(1).css("color","red").css("border","1px dotted black"); //返回相应的元素对象集合

通过$(“str”)来获取元素

进一步封装 $ 函数,从而使得调用方法对标 JQuery

$('#id').css().css()

$('.class').eq(2).css().css()

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
39
40
41
42
43
44
45
46
47
48
49
50
var $ = function(str){
var base = new Base();
if(str[0] == "#"){
base.$(str.substr(1,str.length - 1));
}
else if(str[0] == '.'){
base.$$(str.substr(1,str.length - 1));
}
else{
//TagName
}
return base;
}
function Base(){
this.elements = []; //创建一个数组,来保存获取的节点和节点数组
this.current = -1; //用于遍历

this.$ = function(id){
//因为每一次使用$都会新建对象,所以不需要清空,不会异常
this.elements.push(document.getElementById(id));
return this; //一定要返回对象,不然无法进行连缀
};

this.$$ = function(className){
var clss = document.getElementsByClassName(className);
for(var i = 0 ;i < clss.length; i++){
this.elements.push(clss[i]);
}
return this;
};

this.eq = function(index){
this.current = index;
return this;
}

this.css = function(attr,val){
if(this.current != -1)this.elements[this.current].style[attr] = val;
else{
for(var i = 0;i < this.elements.length; i++){
this.elements[i].style[attr] = val;
}
}
return this;
}
}

//使用
$("#id").css("color","white").css("background","black"); //返回相应的元素对象
$(".class").eq(1).css("color","red").css("border","1px dotted black"); //返回相应的元素对象集合