选择实现添加类和改写标签里面文字的功能
- 添加类
先声明一个函数
function addClass(nodes, className) {
for (let i = 0; i < nodes.length; i++) {
nodes[i].classList.add(className)
}
}
- 改写标签里面文字
function setText(nodes, text) {
for (let i = 0; i < nodes.length; i++) {
nodes[i].textContent = text
}
}
- 给这两个函数一个公共的命名空间(也就是用一个函数包装起来)
window.jQuery=function jquery(nodes) {
return {
addClass: function(className) {
for (let i = 0; i < nodes.length; i++) {
nodes[i].classList.add(className)
}
},
setText: function(text) {
for (let i = 0; i < nodes.length; i++) {
nodes[i].textContent = text
}
}
}
}
此时这个函数的两个key
就分别是addClass
和setText
,因为它们有同一个参数nodes
,所以可以把nodes
放到共同的命名空间里,传入进来
- 判断传入的参数是节点还是选择器语句(字符串)
先把参数nodes改成nodeOrSelector,声明nodes为一个空对象
let nodes={}
if(typeof nodeOrSelector === 'string'){
let temp = document.querySelectorAll(nodeOrSelector)
for (let i = 0; i < temp.length; i ++){
nodes[i] = temp[i]
}
nodes.length = temp.length
}
else if (nodeOrSelector instanceof Node){
nodes = {
0: nodeOrSelector,
length: 1
}
}
这样无论传入的参数是什么,都能获取到,然后传入nodes
这个伪数组里
- 直接在
工具
函数中使用nodes
,就成了闭包,然后遍历伪数组拿到值,进行DOM操作
addClass: function(className) {
for (let i = 0; i < nodes.length; i++) {
nodes[i].classList.add(className)
}
}
setText: function(text) {
for (let i = 0; i < nodes.length; i++) {
nodes[i].textContent = text
}
}
6.然后给函数改个名字
window.jQuery=$
7.完整代码
window.jQuery = function jquery(nodeOrSelector) {
let nodes = {}
if (typeof nodeOrSelector === 'string') {
let temp = document.querySelectorAll(nodeOrSelector)
for (let i = 0; i < temp.length; i++) {
nodes[i] = temp[i]
}
nodes.length = temp.length
} else if (nodeOrSelector instanceof Node) {
nodes = {
0: nodeOrSelector,
length: 1
}
}
return {
addClass: function(className) {
for (let i = 0; i < nodes.length; i++) {
nodes[i].classList.add(className)
}
},
setText: function(text) {
for (let i = 0; i < nodes.length; i++) {
nodes[i].textContent = text
}
}
}
}
window.$ = jQuery
8.JS Bin上面的效果