先列出代码
window.jQuery = function(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
}
}
nodes.addClass = function(classes) {
for (let i = 0; i < nodes.length; i++) {
nodes[i].classList.add(classes)
}
}
nodes.setText = function(text) {
if (text === undefined) {
var texts = []
for (let i = 0; i < nodes.length; i++) {
texts.push(nodes[i].textContent)
}
return texts
} else {
for (let i = 0; i < nodes.length; i++) {
nodes[i].textContent = text
}
}
}
return nodes
}
分析要求
window.$ = jQuery
var $div = $('div')
$div.addClass('red')
$div.setText('hi')
通过window.jQuery('div')获取到所有的div然后操作它,将所有的div的class添加一个red,将所有 div 的 textContent 变为 hi。
我们需要写一个jQuery,来完成这个需求。
首先jQuery是一个函数,你传给我一个css标签选择器,把你获取到的节点封装成一个伪数组,然后再在这个伪数组上添加属性实现addClass以及setText功能
操作
相同的部分不再赘述,我说一下不同的部分,获取部分我就没改了,多一个判断也能完成需求,
addclass部分,由于我们只用把全部的div添加上class,遍历nodes然后全部add就好了,不过我查了一下,Element.classList.add()可以添加多个class了,
seText函数,要求只要添加hi,获取我也没删除掉.
说一下我遇到的一个问题,在第4行代码的for循环中我错把length写成了lenght,我大概花了2个h才找到这个问题,没有任何报错,于是我去搜了下js代码语法检查,找个一个叫eslint的插件,和npm有关,于是我发现我的命令行都忘记了,研究了半天也没在vscode上实现,需要好好回顾下原来的内容,好像WebStorm自带语法检查,下次研究下。