jQuery的基本設計思想和主要用法,就是"選擇某個網頁元素,而後對其進行某種操做"。
javascript
使用jQuery的第一步,每每就是將一個選擇表達式,放進構造函數jQuery()。構造函數接受一個選擇器或者數組,進而調用不一樣的功能。原理大體是這樣的(超級簡化版):
html
window.$ =window.jQuery = function(selectorOrArray){
let elements
if(typeof selectorOrArray === 'string'){
elements = document.querySelectorAll(selectorOrArray)
}else if(selectorOrArray instanceof Array){
elements = selectorOrArray
}
return {//編寫各類功能的接口
}複製代碼
jQuery選擇網頁元素的方法:
java
$(document) //選擇整個文檔對象
$('#myId') //選擇ID爲myId的網頁元素
$('div.myClass') // 選擇class爲myClass的div元素
$('input[name=first]') // 選擇name屬性等於first的input元素
$('a:first') //選擇網頁中第一個a元素
$('tr:odd') //選擇表格的奇數行
$('#myForm :input') // 選擇表單中的input元素
$('div:visible') //選擇可見的div元素
$('div:gt(2)') // 選擇全部的div元素,除了前三個
$('div:animated') // 選擇當前處於動畫狀態的div元素
複製代碼
鏈式操做是jQuery經典的設計思想,就是最終選中網頁元素之後,能夠對它進行一系列操做,而且全部操做能夠鏈接在一塊兒,以鏈條的形式寫出來,好比:node
$('div').find('h3').eq(2).html('Hello');
//分解開就是下面的意思
$('div') //找到div元素
.find('h3') //選擇其中的h3元素
.eq(2) //選擇第3個h3元素
.html('Hello'); //將它的內容改成Hello複製代碼
那實現的原理也是比較容易理解的,只是很是不容易想到如此騷的操做,這裏舉個例子:好比咱們要編寫一個叫addClass的添加屬性的函數,只要在最後返回這個函數自己,當函數執行完又能夠接着進行操做了。jquery
"addClass":function(className){
for( var i=0;i<elements.length;i++){
elements[i].classList.add(className);
}
return this; 複製代碼
再使用最開始的例子api
$('div').find('h3').eq(2).html('Hello');
//比方說函數執行到了$('div').find('h3'),這裏執行完返回到最開始的$,
//那麼我就能夠繼續調用後面的eq()或html(),若是返回的不是$,就沒法接着進行後面的操做複製代碼
建立新元素的方法很是簡單,只要把新元素直接傳入jQuery的構造函數就好了:
數組
$('<p>Hello</p>');
$('<li class="new">new list item</li>');
$('ul').append('<li>list item</li>');複製代碼
原理是調用了DOM的原生api:bash
elements=[createElement(selectorOrArrayOrTemplate)]
function createElement(string){
const container = document.createElement("template");
container.innerHTML = string.trim();
return container.content.firstChild;
}
複製代碼
jQuery設計思想之五,就是提供兩組方法,來操做元素在網頁中的位置移動。一組方法是直接移動該元素,另外一組方法是移動其餘元素,使得目標元素達到咱們想要的位置。app
假定咱們選中了一個div元素,須要把它移動到p元素後面。函數
第一種方法是使用.insertAfter(),把div元素移動p元素後面:
$('div').insertAfter($('p'));複製代碼
第二種方法是使用.after(),把p元素加到div元素前面:
$('p').after($('div'));複製代碼
表面上看,這兩種方法的效果是同樣的,惟一的不一樣彷佛只是操做視角的不一樣。可是實際上,它們有一個重大差異,那就是返回的元素不同。第一種方法返回div元素,第二種方法返回p元素。你能夠根據須要,選擇到底使用哪種方法。
使用這種模式的操做方法,一共有四對:
.insertAfter()和.after():在現存元素的外部,從後面插入元素
.insertBefore()和.before():在現存元素的外部,從前面插入元素
.appendTo()和.append():在現存元素的內部,從後面插入元素
.prependTo()和.prepend():在現存元素的內部,從前面插入元素複製代碼
appendTo和append實現原理:
appendTo(node){
if(node instanceof Element){
this.each(el => node.appendChild(el)) // 遍歷 elements,對每一個 el 進行 node.appendChild 操做
}else if(node.jquery === true){
this.each(el => node.get(0).appendChild(el)) // 遍歷 elements,對每一個 el 進行 node.get(0).appendChild(el)) 操做
}
},
append(children){
if(children instanceof Element){
this.get(0).appendChild(children)
}else if(children instanceof HTMLCollection){
for(let i =0;i<children.length;i++){
this.get(0).appendChild(children[i])
}
}else if(children.jquery === true){
children.each(node => this.get(0).appendChild(node) }
}複製代碼
除了元素的位置移動以外,jQuery還提供其餘幾種操做元素的重要方法。
複製元素使用.clone()。
刪除元素使用.remove()和.detach()。二者的區別在於,前者不保留被刪除元素的事件,後者保留,有利於從新插入文檔時使用。
清空元素內容(可是不刪除該元素)使用.empty()。
建立新元素的方法很是簡單,只要把新元素直接傳入jQuery的構造函數就好了:
$('<p>Hello</p>');
$('<li class="new">new list item</li>');
$('ul').append('<li>list item</li>');複製代碼