實現一個jQuery的API功能有:
- 給獲取到的元素增加class
- 給獲取到的元素設置文本
實現思路:
- 大視角:根據js執(zhí)行的聲明語句男韧,判斷出window.jQuery本質其實是一個函數,封裝要實現上面功能的函數,這個函數需要接受參數,要返回一個對象,同時帶有addClass屬性和setText屬性。下面是分步實現。
- 在window.jQuery函數中聲明一個對象nodes别凹,這個對象中有兩個屬性,這兩個屬性的value都是函數洽糟,分別實現上面的兩個功能炉菲。
- 簡單的做法:當調用函數jQuery的時候,根據傳入的實參坤溃,直接提供一個解決辦法拍霜,缺點:不實用,只能針對一種情況薪介,遇到其他情況祠饺,需要重新改代碼
- 實用的做法:當調用函數jQuery()的時候,在函數中判斷傳遞的參數是字符串還是節(jié)點汁政,然后對不同的數據類型做出不同的處理道偷,如果傳遞的參數是字符串的話,則一定要加上
nodes.length = temp.length;
记劈,為了之后可以遍歷偽數組勺鸦;如果傳遞的節(jié)點是字符串的話,則返回一個偽數組抠蚣。 - 在對象nodes中用添加不同的屬性(函數)實現不同的功能祝旷。
- nodes.addClass添加了一個判斷傳進來的參數是字符串還是數組履澳,采取不同的處理方法嘶窄。
- 調用jQuery函數會返回對象nodes,從而可以在函數外面調用函數里面的對象中的方法
課后習題:
補全下面的代碼
window.jQuery = ???
window.$ = jQuery
var $div = $('div')
$div.addClass('red') // 可將所有 div 的 class 添加一個 red
$div.setText('hi') // 可將所有 div 的 textContent 變?yōu)?hi
實現代碼:
window.jQuery = function(nodeOrSelector){
var nodes = {};
if(typeof nodeOrSelector === 'string'){
let temp = document.querySelectorAll(nodeOrSelector);
// console.log(temp);
for(let i=0;i<temp.length;i++){
nodes[i] = temp[i];
}
// console.log(nodes)
nodes.length = temp.length;
}else if(nodeOrSelector instanceof Node){
nodes={
0:nodeOrSelector,
length : 1
}
// console.log(nodes)
}
nodes.addClass = function(classes){
//判斷傳進來的參數是字符串還是數組
if(typeof classes === 'string'){
for(let i=0;i<nodes.length;i++){
nodes[i].classList.add(classes);
}
console.log("lalalal")
}else if(classes instanceof Array){
classes.forEach(value =>{
for(let i=0;i<nodes.length;i++){
nodes[i].classList.add(value);
}
})
}
}
nodes.setText = function(value){
for(let i=0;i<nodes.length;i++){
nodes[i].textContent = 'hi';
}
}
return nodes
}
window.$ = jQuery
var $div = $('div')
$div.addClass(['yellow','green','blue']) //可將所有 div 的 class 添加數組里面的元素
$div.addClass('red') // 可將所有 div 的 class 添加一個 red
$div.setText('hi') // 可將所有 div 的 textContent 變?yōu)?hi
注:
上面實現思路的文字有點多距贷,一方面柄冲,對于我來說,梳理一下思路忠蝗,方面之后回來復習一下现横,另一方面,也能夠給別人做一個參考的例子,可以學習到不少的東西戒祠。有點自夸骇两,O(∩_∩)O哈哈~!=低千!