JQuery模块分析及其实现第二部分css部分功能及实现,接第一部分!
hasClass方法
- 功能:如果结果集里只要有一个
dom
元素,具有指定的样式类,就返回true
- 实现思路
定义结果变量
ret
,默认值为false
遍历结果集的每一个
dom
元素,如果当前dom
元素具有指定的样式类,将ret=true
结束循环返回
ret
.如何判断
dom
元素具有指定的样式类?
在dom
元素所有的样式类的首位 + 空格
;在用户指定的样式类首位 + 空格
调用indexOf方法,如果返回值 = -1,表示没有;否则就具有指定样式类
1 | hasClass: function(className) { |
$.each方法
- 功能:实现遍历数组或者伪数组,通过第二个参数(回调函数)来处理遍历到的每一个元素
在回调函数中,this
是指向当前遍历的元素. - 语法:
$.each([数组/伪数组], callback)
; - 实现思路
- 声明
each
函数,定义两个形参,第一个 遍历的(伪)数组;第二: 回调函数 - 使用
for
循环,遍历(伪)数组,再循环体内部执行回调函数. 在执行时,给回调函数传实参 - 实现回调函数内部
this
指向,当前遍历到的元素 - 通过回调函数的返回值,判断是否结束循环. 规定:当返回值为
false
,结束循环1
2
3
4
5
6
7
8
9
10each: function(obj, callback) {
var i = 0,
l = obj.length;
// 遍历数组元素
for (; i < l; i++) {
// 执行用户指定回调函数
// 将当前遍历到的元素以及索引传入回调函数
if (callback.call(obj[i], obj[i], i) === false) break;
}
}
- 声明
itcast中链式编程的实现
- 返回当前方法的调用者:
return this;
get方法
- 功能:根据参数
index
,获取相应dom
元素 - 实现思路
- 将字符串类型转换成数字
index < 0 ==> index +length
return this[index]
1 | get: function(index) { |
eq方法
- 功能:根据参数
index
,获取相应dom
元素,转换成itcast
对象,并且返回
1 | eq: function(index) { |
first方法
1 | first: function() { |
last方法
1 | last: function() { |
css方法
- 功能:
- 获取:如果只传一个参数并且类型不为对象,获取相应的样式属性值
- 设置:a,如果只传一个参数并且类型为对象,设置多个样式值; b,传入两个参数,设置单个样式.
- 实现思路
- 给
itcast
原型添加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
36css: function(name, value) {
// 只传入一个参数
if (value == undefined) {
// 如果name类型为对象,同时设置多个样式
if (typeof name === 'object') {
// 遍历this上的每一个dom元素
this.each(function(v) {
// 枚举name上的每个属性值
for (var k in name) {
// 给当前遍历到的dom元素设置样式
v.style[k] = name[k];
}
});
} else { // 如果name不为对象
// 默认获取this上的第一个dom元素的指定样式值
// 如果浏览器支持getComputedStyle,使用该方法获取指定样式值
// if(window.getComputedStyle){
// return window.getComputedStyle(this[0])[name];
// } else { //否则使用currentStyle获取
// return this[0].currentStyle[name];
// }
// 如果this上没有任何dom元素, 就返回null
if (!this[0]) return null;
return window.getComputedStyle ?
window.getComputedStyle(this[0])[name] :
this[0].currentStyle[name];
}
} else { // 如果传入两个参数
this.each(function(v) {
v.style[name] = value;
});
}
// 实现链式编程
return this;
},
- 给
addClass方法
- 功能:给结果集中的每一个
dom
元素添加指定样式类. - 实现思路
- 遍历
this
上的每一个dom
元素 - 首先判断当前遍历到的
dom
元素是否含有样式类.
- 遍历
1 | addClass: function(className) { |
removeClass方法
- 功能:删除结果集中的每一个
dom
元素的指定样式类. - 实现思路
- 遍历
this
上的每一个dom
元素 (' ' + v.className + ' ').replace(' ' + className + ' ',' ');
1
2
3
4
5
6
7
8removeClass:function(className) {
// 遍历this上的每一个dom元素,并实现链式编程
return this.each(function(v) {
// 删除当前dom元素的样式类className
v.className = (' ' + v.className + ' ').
replace(' ' + className + ' ', ' ');
});
}
- 遍历
toggleClass方法
- 功能: 切换指定的样式类,如果有,就删除,没有就添加
- 实现思路
- 遍历
this
上的每一个dom
元素 - 判断当前遍历到的
dom
元素是否含有指定的样式类 - 如果有,就删除
- 如果没有,就添加
1
2
3
4
5
6
7
8
9
10
11
12
13toggleClass: function(className) {
// 遍历this上的每一个dom元素,并实现链式编程
return this.each(function(v) {
// 将当前遍历到的元素转换成itcast对象
var $v = itcast(v);
// 如果具有指定的样式类,就删除该样式类
if($v.hasClass(className)){
$v.removeClass(className);
} else { // 如果没有指定的样式类,就添加该样式类
$v.addClass(className);
}
});
}
- 遍历