Skip to content

Commit 752aadc

Browse files
framework
1 parent 3053e09 commit 752aadc

27 files changed

+828
-2394
lines changed
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Title</title>
6+
<script src="core.js"></script>
7+
</head>
8+
<body>
9+
<div>
10+
<span>1111</span>
11+
<span>2222</span>
12+
<span>3333</span>
13+
<span>4444</span>
14+
<span>
15+
<a>1</a>
16+
<a>2</a>
17+
<a>3</a>
18+
</span>
19+
</div>
20+
<script>
21+
// attr 设置或者获取元素的属性节点值
22+
23+
/*
24+
* 属性节点:
25+
* 1、在html中编写的所有标签,里面的属性都是属性节点。
26+
* 2、所有的DOM,都有一个attributes属性,这个属性里面按照下标的方式存储了该DOM所有的属性节点。
27+
*
28+
* 属性节点和属性的区别:
29+
* 1.属性节点只属于DOM对象,属性可以属于任意的对象。
30+
* 2.属性节点有DOM对象的那些特点,比如有nodeType,nodeName;而属性存储的东西没有共性。
31+
*
32+
* 如何获取属性节点值:
33+
* 1、通过DOM的attributes属性得到所有的属性节点对象,然后按照下标取出每一个属性节点对象,再通过nodeValue属性得到这个属性节点值
34+
* 2、通过DOM的getAttribute( 属性节点名 )
35+
*
36+
* 如何设置属性节点值:
37+
* 1、通过DOM的attributes属性得到所有的属性节点对象,然后按照下标取出每一个属性节点对象,再通过nodeValue属性来设置
38+
* 2、通过DOM的setAttribute( value值 )
39+
*
40+
* 如何获取设置属性值:
41+
* 1、直接点或者[]获取和设置。
42+
* */
43+
44+
// 如果传入的第一个参数不是字符串或者不是对象,
45+
// 那么直接返回this。
46+
console.log($('div').attr(undefined));
47+
48+
// 传入1个参数,获取第一个元素的属性节点值
49+
console.log($('div').attr('index'));
50+
51+
// 传入2个参数,设置所有元素的属性节点值,返回this
52+
console.log($('div').attr('val', 10));
53+
54+
// 传入一个对象,可以批量设置所有元素的属性节点值,返回this
55+
console.log($('div').attr({
56+
a: 'aaaa',
57+
b: 'bbbb',
58+
c: 'cccc'
59+
}));
60+
61+
62+
var divs = $('div').toArray();
63+
// 给DOM对象设置的属性节点值,如果为对象,那么会转换为字符串再赋值
64+
// 而{}转换为了[object Object]
65+
divs[0].setAttribute( 'o', { val: 1 } );
66+
// 而new String('abc')转换为了'abc'
67+
divs[1].setAttribute( 'o', new String('abc' ) );
68+
// 预期给第一个div设置一个o属性节点为一个对象,发现不行
69+
divs[0].setAttribute( 'o', getStr.call( { val: 1 } ) );
70+
// 预期给第二个div设置一个o属性节点为一个字符串,发现可以
71+
/*
72+
function fn() {// fn里面的this,是包装过的对象
73+
console.log( this );
74+
}
75+
fn.call( 1 ); // Number
76+
fn.call( 'abc' ); // String
77+
*/
78+
divs[1].setAttribute( 'o', getStr.call( 'abc' ) );
79+
function getStr() {
80+
return this;
81+
}
82+
83+
84+
// 给原型扩展属性和样式操作方法,这样jQ实例就可以使用了
85+
$.fn.extend( {
86+
87+
// 设置或者获取元素的属性节点值
88+
attr: function( attr, val ) {
89+
90+
/*
91+
* 实现思路:
92+
* 1、判断attr是不是字符串或者对象,不是直接return this。
93+
* 2、如果是字符串,那么继续判断arguments的length
94+
* 3、length为1,则获取第一个元素指定的属性节点值返回
95+
* 4、length>=2,则遍历所有元素,分别给他们设置新的属性节点值( setAttribute )
96+
* 5、如果不是字符串(是对象),那么遍历这个对象,得到所有的属性节点值,
97+
* 然后遍历所有的元素,把所有的属性节点分别添加到这些元素中。
98+
* 6、return this。
99+
* */
100+
101+
// 不是字符串也不是对象,直接返回this
102+
if( !jQuery.isString( attr ) && !jQuery.isObject( attr ) ) {
103+
return this;
104+
}
105+
106+
// 如果是字符串
107+
if( jQuery.isString( attr ) ) {
108+
109+
// 如果length为1,则直接返回第一个元素的属性节点值
110+
if( arguments.length === 1 ) {
111+
return this.get( 0 ).getAttribute( attr );
112+
}
113+
114+
// 如果length为多个(2和及2个以上)
115+
// 则遍历所有的元素,分别设置属性节点值
116+
else {
117+
for( var i = 0, len = this.length; i < len; i++ ) {
118+
this[ i ].setAttribute( attr, val );
119+
}
120+
}
121+
122+
}
123+
124+
// 如果是对象
125+
// 遍历这个对象,和所有的元素,分别添加遍历到的属性节点值
126+
else {
127+
128+
// 遍历得到所有的属性节点和属性节点值
129+
for( var key in attr ) {
130+
131+
// 遍历得到所有的元素
132+
for( var i = 0, len = this.length; i < len; i++ ) {
133+
134+
this[ i ].setAttribute( key, attr[ key ] );
135+
}
136+
137+
}
138+
}
139+
140+
// 链式编程
141+
return this;
142+
},
143+
144+
// 设置或者获取元素的属性节点值
145+
_attr: function( attr, val ) {
146+
147+
/*
148+
* 实现思路:
149+
* 1、判断arguments.length
150+
* 2、如果为1
151+
* 3、继续判断attr是不是字符串,如果是获取第一个元素指定的属性节点值返回
152+
* 4、如果不是继续判断是不是对象,如果是遍历这个对象,得到所有的属性节点值,
153+
* 然后遍历所有的元素,把所有的属性节点分别添加到这些元素中。
154+
* 5、如果为多个(2及以上),遍历所有元素分别设置属性节点值。
155+
* 6、return this。
156+
* */
157+
158+
// 把实例使用别称存储一下,为了在其他地方使用
159+
var self = this;
160+
161+
// 如果参数个数为1
162+
if( arguments.length === 1 ) {
163+
164+
// 如果是字符串,获取第一个元素指定的属性节点值返回
165+
if( jQuery.isString( attr ) ) {
166+
return this[ 0 ].getAttribute( attr );
167+
}
168+
169+
// 如果是对象,把对象中所有的属性节点添加到所有的元素中
170+
else if( jQuery.isObject( attr ) ) {
171+
172+
// 使用jQ静态each方法遍历attr对象
173+
jQuery.each( attr, function( key, val ) {
174+
// 这里遍历到的val不是对象类型,是基本数据类型,
175+
// 我们要使用的就是基本数据类型,而this是基本数据类型的包装类型(),
176+
// 所以这里不能使用this。
177+
178+
// 遍历所有的元素
179+
self.each( function() {
180+
181+
// 给遍历到的每一个元素分别设置外面遍历到的属性节点
182+
this.setAttribute( key, val );
183+
184+
} );
185+
} );
186+
187+
}
188+
189+
}
190+
191+
// 如果参数个数为多个
192+
else if( arguments.length >= 2 ) {
193+
194+
// 遍历所有元素分别设置对应的属性节点值
195+
this.each( function() {
196+
this.setAttribute( attr, val );
197+
});
198+
}
199+
200+
// 链式编程
201+
return this;
202+
}
203+
} );
204+
205+
</script>
206+
</body>
207+
</html>

0 commit comments

Comments
 (0)