我們的目的實現(xiàn)以下功能:
window.jQuery = ???
window.$ = jQuery
var $div = $(‘div’)
$div.addClass(‘red’) // 可將所有 div 的 class 添加一個 red
$div.setText(‘hi’) // 可將所有 div 的 textContent 變?yōu)?hi
首先镣典,想用$和jQuery,直接聲明成全局變量
window.jQuery = function() {}
window.$ = jQuery
我們要把jQuery和$封裝成一個方法唾琼,可以選中dom元素兄春。
在調(diào)用這個方法時,這里我們可以給它傳一個dom元素锡溯,也可以傳一個選擇器(字符串)赶舆。
我們默認(rèn)傳遞的是一個dom元素,即 let nodes = { 0: nodeOrSelector, length: 1 }祭饭;
然后再對傳遞的參數(shù)類型用typeof進(jìn)行判斷芜茵,如果是'string'類型,那么我們把它作為一個選擇器甜癞,用querySelectorAll來選中dom元素夕晓。
然后,將nodes返回悠咱。這就實現(xiàn)了用$和jQuery來作為選擇器選中dom元素蒸辆。而且我們返回的是一個純凈的偽數(shù)組征炼,沒有原生dom的方法和屬性。
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
}
}
return node()
}
然后躬贡,我們來對這個函數(shù)添加兩個方法谆奥。
$div.addClass(‘red’) // 可將所有 div 的 class 添加一個 red:
nodes.addClass = function(classes) {
classes.forEach((value) => {
for (let i = 0; i < nodes.length; i++) {
node[i].classList.add(value)
}
})
}
$div.setText(‘hi’) // 可將所有 div 的 textContent 變?yōu)?hi:
nodes.text = 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
}
}
}
最終代碼如下:
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) {
classes.forEach((value) => {
for (let i = 0; i < nodes.length; i++) {
node[i].classList.add(value)
}
})
}
nodes.text = 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
}