實現程式碼大概邏輯流程就是:
1.首先提出問題:假設要給li元素新增class類演示和文字內容,該如何實現?
2.解決問題:
1.1首先得獲取到所有的元素,知道有幾個li元素需要進行調整,所以得使用迴圈遍歷來找出所有的li元素。
2.2.獲取到所有li元素後,要對每一個li元素都新增class類樣式,同樣的也需要迴圈遍歷來給每個li元素新增樣式。
3.3要給每一個li元素新增文字內容,同樣的也需要迴圈遍歷來給每個li元素新增內容。
4.4既然要做三件事,那就得用三個函式來實現。
邏輯對了,實現起來程式碼就會更加的快捷和準確。
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
}
}//迴圈遍歷出所有的nodeOrSelector,例如:li
nodes.addClass = function (classes){
classes.forEach(value) => {
for(let i = 0;i<nodes.length;i++){
nodes[i].classList.add(value)
}
}
}//給所有的li新增class類,
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
}
}
}//給所有的li新增‘hi’
return nodes
}
window.$ = jQuery
$li = $('ul>li')
$li.addClass(['blue'])
$li.text('hi')
複製程式碼
以上是一個利用原生js封裝成函式後來說明jQuery內部執行的基本原理,我們可以模仿jQuery隨意新增元素節點和類來進行頁面內容的控制,可以讓我們對jQuery有個更清楚的瞭解, 因為在理解過程中有一些程式碼讓我困擾了一會,為了加深理解,特進行單獨的說明,
易錯細節:
1.nodeOrSelector instanceNode
這段程式碼我當時也是很不理解,因為一般instanceof是用來檢測物件型別的,而這個Node看上去也不是我所瞭解的物件型別,instanceof一般使用方法如下:
alert(person instanceof Object); // 變數 person 是 Object 嗎?
alert(colors instanceof Array); // 變數 colors 是 Array 嗎?
alert(pattern instanceof RegExp); // 變數 pattern 是 RegExp 嗎?
複製程式碼
Node好像不在這些引用型別當中呀!《js高程設計》中也沒有說,一般Node好像是作為節點來用,o(╥﹏╥)o 然後我翻了翻網上的文件,最後明白了,這個Node是作為Node物件,Node物件是屬於DOM裡面的物件,而Object,Array,Date,RegExp,Function等是屬於ECMAscript裡面的物件,因此他們都可以使用這個instanceof來檢測物件型別,理解了這個,也就茅塞頓開了。
2.閉包函式,我們先來熟悉下閉包函式的意思:閉包是指能訪問到其他函式內部中的變數的函式,這個函式就叫做閉包(函式不一定要return),
在上面的程式碼中,我們也是用了閉包:
nodes.addClass = function (classes){xxx}
nodes.text = function(text){}
上面這倆函式都訪問了他們外部的變數nodes,從而可以進行class類的新增和textcontent文字內容的新增,這裡就是使用閉包函式的好處,
3.程式碼中多次使用了迴圈遍歷,一定要注意,其中的偽陣列是沒有push方法的,所以不能使用push方法,我經常也是會不注意就錯了, 還糾結半天哪裡不對,結果白費半天功夫。
4.後面在遇到關於jQuery和DOM有關的問題將在後面繼續補充,