首先看下题目
window.jQuery = ???
window.$ = jQuery
var $div = $('div')
$div.addClass('red') // 可将所有 div 的 class 添加一个 red
$div.setText('hi') // 可将所有 div 的 textContent 变为 hi
答案如下
window.jQuery = function (node) {
return {
//classNameList是一个哈希表,key为className,value为是布尔,true表示加名字,false表示删名字
addClass: function (classNameList) {
//获取全部DIV标签
let divs = document.querySelectorAll(node)
//给每个标签添加class
for (let i = 0; i < divs.length; i++) {
for (let key in classNameList) {
let methodName = classNameList[key] ? 'add' : 'remove'
divs[i].classList[methodName](key)
}
}
},
setText: function (text) {
//获取全部DIV标签
let divs = document.querySelectorAll(node)
//修改每个DIV的textContent
for (let i = 0; i < divs.length; i++) {
divs[i].textContent = text
}
}
}
}
分析一下
$div需要拥有addClass和setText方法,所以window.jQuery = ???应该要返回这两个方法。可以确定???处的结构
window.jQuery = function (){
return {
addClass:function (){},
setText:function (){}
}
}
确定好结构就可以懵逼愉快的写代码来实现啦。
首先题目需要获取到所有的DIV,这时候浏览器自带的API就可以发挥作用了
document.querySelectorAll()
上面的API会返回一个数组,数组里就是全部的DIV了。
拿到标签数组,遍历之。
遍历的时候为每一个元素加上class,使用到的还是浏览器自带的API。
Element.classList.add()//添加class
Element.classList.remove()//删除class
这样一个简单的API就写好了。
这里有个技巧
let methodName = classNameList[key] ? 'add' : 'remove'
divs[i].classList[methodName](key)
//没有简化前
if(classNameList[key]){
divs[i].classList.add(key)
}else{
divs[i].classList.remove(key)
}
上面classList[methodName]会是'add'或者'remove',分别对应classList.add和classList.remove。
setText的思路和上面基本一致。就是换一个API
Node.textContent
最后测试结果如下
优化了一下代码
window.jQuery = function (nodeOrSelector) {
let nodes = {}
//判断参数类型
if (typeof nodeOrSelector === 'string') {
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 }
}
//添加addClass方法
nodes.addClass = function (classNameList) {
//给每个标签添加class
for (let i = 0; i < nodes.length; i++) {
for (let key in classNameList) {
let methodName = classNameList[key] ? 'add' : 'remove'
nodes[i].classList[methodName](key)
}
}
}
//添加text方法
nodes.text = function (text) {
if (text === undefined){
let 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
}
}
}
//返回给$div,不然$div啥也没有
return nodes
}
window.$ = jQuery
let $div = $.call(undefined, 'div')
$div.addClass.call($div, {
red: false,
pink: true
})
$div.text.call($div,'hi')