原生JS操作
1 | <ul style='border: 1px solid #666'> |
代码结果:
- Hi
现在,我想为 <li>
标签添加一个样式,
1 | .red { color: red; } |
并改变文本内容为“Thank you~”。用原生JS的写法就是:
1 | li.classList.add('red') |
代码结果:
- Thank you~
模仿jQuery实现一个API
如果要模仿jQuery,实现一个jQuery的API,那么实现方法如下:
封装函数。将每个功能封装成一个函数,需要使用到时调用这个函数即可。
1
2
3
4
5
6
7
8
9
10
11
12/* 封装添加样式的函数addClass */
function addClass(node, className) {
node.classList.add(className)
}
/* 封装设置内容的函数setText */
function setText(node, text) {
node.textContent = text
}
addClass(li, 'red')
setText(li, 'Thank you~')将第一个参数(节点)提取出来变成
node.functionName()
的形式。1
2
3
4
5
6
7
8
9
10
11
12
13
14function jQuery(node){
return {
addClass: function(className){
node.classList.add(className)
},
setText: function(text){
node.textContent = text
}
}
}
var node = jQuery(li)
node.addClass('red')
node.setText('Thank you~')处理多个节点的情况。
1
2
3
4<ul style='border: 1px solid #666'>
<li>Hi</li>
<li>Welcome</li>
</ul>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19function jQuery(nodeOrSelector){
var elements = (typeof nodeOrSelector === 'string') ? document.querySelectorAll(nodeOrSelector) : { 0: nodeOrSelector, length: 1 }
return {
addClass: function(className){
for(let i=0; i<elements.length; i++){
elements[i].classList.add(className)
}
},
setText: function(text){
for(let i=0; i<elements.length; i++){
elements[i].textContent = text
}
}
}
}
var node = jQuery('li')
node.addClass('red')
node.setText('Thank you~')简化jQuery函数名
1
2
3window.$ = jQuery;
$('li').addClass('red')
$('li').setText('Thank you~')最终运行结果:
- Thank you~
- Thank you~
总结
说白了,jQuery就是一个函数,它返回一个对象,里面包含节点的属性和方法。节点可以调用这些方法来操作DOM。
PS:完整代码如下
1 | window.jQuery = function(nodeOrSelector){ |