所有代碼看個人github的DOM-1項目html
<script src="dom.js"></script>
<script src='main.js'></script>
,由於main.js須要使用dom.js的代碼創造dom是個全局對象,在裏面寫函數,誰均可以用git
window.dom = {
add(){console.log('我是dom')}
}
複製代碼
dom
了dom.add()
parcel src/index.html
所有代碼看個人github的DOM-2項目github
<script src="jQuery.js"></script>
<script src='main.js'></script>
,由於main.js須要使用jQuery.js的代碼創造jQuery是個全局函數編程
window.jQuery = function () {
console.log('我是jQuery')
}
複製代碼
jQuery
了jQuery()
parcel src/index.html
window.jQuery = function(selector) {
//1.jQuery是個全局函數,咱們要給他一個選擇器當參數
const elements = document.querySelectorAll(selector); //2.他會選出知足條件的節點,組成一個僞數組叫element
const api = {
//3.他會生成一個叫api的對象,這個對象裏的每個函數都和elements造成閉包,也就是每一個函數都要用到elements
//用這個api對象裏的任意一個函數均可以操做elements
addClass(className) {
//給我一個class的名字,我會遍歷每一個element中的元素,給他們都加上className
for (let i = 0; i < elements.length; i++) {
elements[i].classList.add(className);
}
}
};
return api; //4.最後返回對象api,這個對象裏的函數能夠對選中的元素(elements)操做
};
//你想選出(操做)哪些元素,你就把對應的選擇器給jQuery函數,而後他會給你能夠操做這些元素的函數集合(api對象)
//我想對.test的元素操做,那麼jQuery(.test)就是一個叫api的對象,他包含了全部能夠對.test元素操做的函數
//jQuery(.test).addClass('yy') 這樣就對全部.test元素加上個叫yy的class
複製代碼
window.jQuery = function(selector) {
const elements = document.querySelectorAll(selector);
const api = {
addClass(className) {
for (let i = 0; i < elements.length; i++) {
elements[i].classList.add(className);
}
return api //執行完函數後仍是返回api,能夠繼續對elements操做
}
};
return api;
};
//jQuery(.test).addClass('yy') 這樣就對全部.test元素加上個叫yy的class,可是返回值還是api,也就是說咱們能夠繼續對.test操做
//jQuery(.test).addClass('yy').addClass('bb')對全部.test元素加上個叫yy的class,由於返回值是api,咱們仍可對全部.test元素操做加上bb的class
複製代碼
注意到,jQuery(.test).addClass('yy')
的this就是jQuery(.test)也就是api。 jQuery(selector).addClass('yy')
的this===jQuery(selector)===api,因此改爲return thisapi
window.jQuery = function(selector) {
const elements = document.querySelectorAll(selector);
const api = {
addClass(className) {
for (let i = 0; i < elements.length; i++) {
elements[i].classList.add(className);
}
return this //執行完函數jQuery(selector).addClass(xxx)後仍是返回this(=jQuery(selector)),還能夠繼續對elements操做
}
};
return api;
};
複製代碼
window.jQuery(selector)
的this是window,不要暈倒了數組
window.jQuery = function(selector) {
const elements = document.querySelectorAll(selector);
return {
addClass(className) {
for (let i = 0; i < elements.length; i++) {
elements[i].classList.add(className);
}
return this;
}
};
};
複製代碼
①jQuery(選擇器)
用於獲取對應的元素bash
jQuery(.test) 返回 當前的JQuery對象
jQuery(.test).addClass('yy') 操做:給全部.test元素加上class:yy 返回:this===jQuery(.test) ----當前的JQuery對象
jQuery(.test).addClass('yy').addClass('bb') 操做:給全部.test元素加上class:bb 返回:this===jQuery(.test).addClass('yy') ----當前的JQuery對象
複製代碼
②jQuery
是一個不須要加new
的構造函數。閉包
jQuery()
能構造一個對象,並且不用加new
jQuery
不是常規意義上的構造函數,這是由於jQuery
用了一些技巧(目前不必知道)③window.$ = window.jQuery
之後用$()
就行框架
④用$
開頭的名字給JQuery對象命名!const $div=jQuery(.test)
易於和普通DOM標籤區分!dom
window.jQuery = function(selector) {
const elements = document.querySelectorAll(selector);
return {
//對elements操做
//1、查
//find函數用於找某些元素
find(selector) {
let array = []; //這個數組將儲存結果元素
for (let i = 0; i < elements.length; i++) {
//對elements中每個元素中來找其中的結果元素
array = array.concat(
Array.from(elements[i].querySelectorAll(selector))
);
//全部結果元素會成爲僞數組,把僞數組變成真數組,在鏈接到array中去,成爲新的array
}
return array;
},
};
};
複製代碼
那完了,鏈式結構中斷了。jQuery('.test').find('.children')
函數返回的是數組array,不是this了!若是返回this,那就是那個jQuery對象了,以後仍是對.test對象操做,那你找.children幹啥??
jQuery(數組)
成爲新的jQuery對象,而後return他;不然直接return this
返回當前的JQuery對象就行window.jQuery = function (selectorOrArray) {
let elements //const聲明時必須賦值並且還不能改,因此只能用let了//不能夠在下面elements前聲明,否則就只在那個塊級做用域裏有用了
if (typeof selectorOrArray === 'string') { //若是是字符串,那就是選擇器,選出對應元素
elements = document.querySelectorAll(selectorOrArray)
} else if (selectorOrArray instanceof Array) { //若是是數組,那就是它自己
elements =selectorOrArray
}
return {
//對elements操做
find(selector) {
let array = [];
for (let i = 0; i < elements.length; i++) {
array = array.concat(
Array.from(elements[i].querySelectorAll(selector))
);
}
const newApi = jQuery(array) //咱們不能夠return以前的api了,否則你find出這些元素幹啥?確定要對find出的元素搞事情了啊。//因此發現jQuery不能只接受選擇器,還要有數組
//生成全新的jQuery對象了(專屬這個數組裏元素的函數集合)
return newApi;
//前兩句請合併爲 return jQuery(array)
},
addClass(className) {
for (let i = 0; i < elements.length; i++) {
elements[i].classList.add(className);
}
return this;
}
};
};
複製代碼
jQuery(數組)
前,要先把當前的JQuery對象加進數組裏,成爲一個新屬性oldApi
oldApi:selectorOrArray.oldApi
end
函數:返回當前jQuery對象的oldApiwindow.jQuery = function(selectorOrArray) {
let elements;
if (typeof selectorOrArray === "string") {
elements = document.querySelectorAll(selectorOrArray);
} else if (selectorOrArray instanceof Array) {
elements = selectorOrArray;
}
return {
oldApi: selectorOrArray.oldApi, //給JQuery對象加一個屬性,值爲selectorOrArray的oldApi屬性
find(selector) {
let array = [];
for (let i = 0; i < elements.length; i++) {
array = array.concat(
Array.from(elements[i].querySelectorAll(selector))
);
}
array.oldApi = this; //先把當前的jQuery對象放到即將要成爲新的elements的數組中去,成爲一個oldApi屬性
return jQuery(array); //在返回 新建的 數組的jQuery對象
},
end() {
return this.oldApi;
}, //this爲數組的JQuery對象了,他有個oldApi屬性,屬性值爲selectorOrArray(也就是數組)的屬性oldApi
addClass(className) {
for (let i = 0; i < elements.length; i++) {
elements[i].classList.add(className);
}
return this;
}
};
};
複製代碼
api1=jQuery('.test')
api2=jQuery('.test').find('.children')
api2.end()//返回this的oldApi。
//this===api2===當前的JQuery對象。
//oldApi:selectorOrArray.oldApi=array.oldApi=(當時的this)=(當時的JQuery對象api2)
複製代碼