实现一个 jQuery 的 API
2019-08-16 本文已影响0人
YukiWeng
需要实现的效果:
1.可将所有 div 的 class 添加一个 red
2.可将所有 div 的 textContent 变为 hi
补全问号处的代码
window.jQuery = ???
window.$ = jQuery
var $div = $('div')
$div.addClass('red')
$div.setText('hi')
思路如下:
初始化一个hash对象
判断传入参数为字符串(选择器)还是节点
①若为字符串 => 寻找对应节点=>放入hash
②若为节点=>直接放入hash
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
//这里用了一个中间变量temp只是为了让nodes结果更纯净,去掉也可以
}else if(nodeOrSelector instanceof Node){
nodes={
0:nodeOrSelector,
length:1
}
}
添加两个方法函数
使用DOM API
nodes.addClass=function(classes){
for(let i=0;i<nodes.length;i++){
nodes[i].classList.add(classes)
}
}
nodes.setText=function(text){
for(let i=0;i<nodes.length;i++){
nodes[i].textContent=text
}
}
return nodes
}
完整代码如下:
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
//这里用了一个中间变量temp只是为了让nodes结果更纯净,去掉也可以
}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){
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')
优化:
代码中addClass方法一次只允许传一个值,若希望传多个class,可改为传数组,并使用forEach方法;
setText方法传值后,会覆盖掉原本的文本,若希望完善一些,可添加判断语句
nodes.addClass=function(classes){
classes.forEach((value)=>{
for(let i =0;i<nodes.length;i++){
nodes[i].classList.add(value)
}
})
}
nodes.text=function(text){
if(text===undefined){
let text=[]
for(i=0;i<nodes.length;i++){
text.push(nodes[i].textContent)
}
return text
}else{
for(let i=0;i<nodes.length;i++){
nodes[i].textContent=text}
}
}
return nodes
}
$div.addClass(['red','blue']) //添加了两个class
$div.text('hi') // 用hi覆盖原文本
$div.text() // 返回文本