jQuery 如何獲取元素
jQuery的基本設計思想和主要用法,就是"選擇某個網頁元素,然後對其進行某種操作"。
使用jQuery的第一步,往往就是將一個選擇表示式,放進建構函式jQuery()。建構函式接受一個選擇器或者陣列,進而呼叫不同的功能。原理大致是這樣的(超級簡化版):
window.$ =window.jQuery = function(selectorOrArray){
let elements
if(typeof selectorOrArray === 'string'){
elements = document.querySelectorAll(selectorOrArray)
}else if(selectorOrArray instanceof Array){
elements = selectorOrArray
}
return {//編寫各種功能的介面
}複製程式碼
jQuery選擇網頁元素的方法:
$(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 的鏈式操作是怎樣的
鏈式操作是jQuery經典的設計思想,就是最終選中網頁元素以後,可以對它進行一系列操作,並且所有操作可以連線在一起,以鏈條的形式寫出來,比如:
$('div').find('h3').eq(2).html('Hello');
//分解開就是下面的意思
$('div') //找到div元素
.find('h3') //選擇其中的h3元素
.eq(2) //選擇第3個h3元素
.html('Hello'); //將它的內容改為Hello複製程式碼
那實現的原理也是比較容易理解的,只是非常不容易想到如此騷的操作,這裡舉個例子:比如我們要編寫一個叫addClass的新增屬性的函式,只要在最後返回這個函式本身,當函式執行完又可以接著進行操作了。
"addClass":function(className){
for( var i=0;i<elements.length;i++){
elements[i].classList.add(className);
}
return this; 複製程式碼
再使用最開始的例子
$('div').find('h3').eq(2).html('Hello');
//比方說函式執行到了$('div').find('h3'),這裡執行完返回到最開始的$,
//那麼我就可以繼續呼叫後面的eq()或html(),如果返回的不是$,就無法接著進行後面的操作複製程式碼
jQuery 如何建立元素
建立新元素的方法非常簡單,只要把新元素直接傳入jQuery的建構函式就行了:
$('<p>Hello</p>');
$('<li class="new">new list item</li>');
$('ul').append('<li>list item</li>');複製程式碼
原理是呼叫了DOM的原生api:
elements=[createElement(selectorOrArrayOrTemplate)]
function createElement(string){
const container = document.createElement("template");
container.innerHTML = string.trim();
return container.content.firstChild;
}
複製程式碼
jQuery 如何移動元素
jQuery設計思想之五,就是提供兩組方法,來操作元素在網頁中的位置移動。一組方法是直接移動該元素,另一組方法是移動其他元素,使得目標元素達到我們想要的位置。
假定我們選中了一個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 如何修改元素的屬性
除了元素的位置移動之外,jQuery還提供其他幾種操作元素的重要方法。
複製元素使用.clone()。
刪除元素使用.remove()和.detach()。兩者的區別在於,前者不保留被刪除元素的事件,後者保留,有利於重新插入文件時使用。
清空元素內容(但是不刪除該元素)使用.empty()。
建立新元素的方法非常簡單,只要把新元素直接傳入jQuery的建構函式就行了:
$('<p>Hello</p>');
$('<li class="new">new list item</li>');
$('ul').append('<li>list item</li>');複製程式碼