實(shí)際前端開發(fā)工作中,我們經(jīng)常會遇到要獲取某些元素,以達(dá)到更新該元素的樣式、內(nèi)容等目的。而文檔對象模型 (DOM) 是HTML和XML文檔的編程接口,它提供了對文檔的結(jié)構(gòu)化的表述,并定義了一種方式可以使從程序中對該結(jié)構(gòu)進(jìn)行訪問,從而改變文檔的結(jié)構(gòu),樣式和內(nèi)容。DOM 將文檔解析為一個(gè)由節(jié)點(diǎn)和對象(包含屬性和方法的對象)組成的結(jié)構(gòu)集合,它會將web頁面和腳本或程序語言連接起來。也因此,JavaScript可以通過DOM API獲取元素節(jié)點(diǎn),方法有如下幾種:其中querySelector()和querySelectorAll()為ES5的元素選擇方法
作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)建站提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都網(wǎng)站建設(shè)、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運(yùn)營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價(jià)值。
1、getElementById():
接收一個(gè)參數(shù):要取得的元素的ID(區(qū)分大小寫,必須嚴(yán)格匹配),返回一個(gè)Element對象(也可看作是動態(tài)NodeList集合,只是集合中只包含一個(gè)匹配的元素,但也會實(shí)時(shí)反映DOM節(jié)點(diǎn)的變化),若當(dāng)前文檔中擁有特定ID的元素不存在則返回nul。
語法:
element = document.getElementById(id);
示例:刪除
<body> <div id="myDiv"> <p class="myP">hello world</p> <p class="myP">hello dolby</p> <p class="myP">hello dot</p> <p class="myP">hello bean</p> </div> <script> var div = document.getElementById("myDiv"); console.log(div); //(1) var body=document.querySelector('body'); body.removeChild(div); console.log(body); //(2) </script> </body>
//(1)處打印值 <div id="myDiv"> <p class="myP">hello world</p> <p class="myP">hello dolby</p> <p class="myP">hello dot</p> <p class="myP">hello bean</p> </div> //(2)處打印值 <body> <script> var div = document.getElementById("myDiv"); console.log(div); //(1) var body=document.querySelector('body'); body.removeChild(div); console.log(body); //(2) </script> </body>
示例:
<!DOCTYPE html> <html> <head> <title>getElementById example</title> <script> function changeColor(newColor) { var elem = document.getElementById("para1"); elem.style.color = newColor; } </script> </head> <body> <p id="para1">Some text here</p> <button onclick="changeColor('blue');">blue</button> <button onclick="changeColor('red');">red</button> </body> </html>
getElementById()方法不會搜索不在文檔中的元素。當(dāng)創(chuàng)建一個(gè)元素且分配ID后,必須要使用insertBefore()或其他類似的方法把元素插入到文檔中之后才能使用 getElementById() 獲取到:
var element = document.createElement("div"); element.id = 'testqq'; var el = document.getElementById('testqq'); // el will be null!
2、getElementsByClassName():
接收一個(gè)參數(shù),即包含一個(gè)或多個(gè)類名的字符串(類名通過空格分隔),返回一個(gè)HTMLCollection動態(tài)集合(也可以說返回一個(gè)NodeList類數(shù)組對象),集合中包含以當(dāng)前元素為根節(jié)點(diǎn),所有指定 class 名的子元素。
語法:
var elements = document.getElementsByClassName(names); var elements = rootElement.getElementsByClassName(names);
getElementsByClassName 可以在任意的元素上調(diào)用,不僅僅是document。 調(diào)用這個(gè)方法的元素將作為本次查找的根元素。
示例:
獲取所有 class 為 'test' 的元素:
document.getElementsByClassName('test');
獲取所有 class 同時(shí)包括 'red' 和 'test' 的元素:
document.getElementsByClassName('red test');
在id 為'main'的元素的子節(jié)點(diǎn)中,獲取所有class為'test'的元素:
document.getElementById('main').getElementsByClassName('test');
示例:刪除
//html代碼 <div class="myDiv"> <p class="myP">hello world</p> <p class="myP">hello dolby</p> <p class="myP">hello dot</p> <p class="myP">hello bean</p> </div>
//js代碼一 <script> var div = document.getElementsByClassName("myDiv"); console.log(div); //(3) var p = document.getElementsByClassName("myP"); for (var i = 0; i < p.length; i++) { div[0].removeChild(p[i]); } console.log(p); //(4) </script>
//(3)處打印值 [div.myDiv] //一個(gè)動態(tài)的HTMLCollection集合,長度為1,innerHTML為<p class="myP">hello dolby</p>,<p class="myP">hello bean</p>,為什么沒有其他兩個(gè)p元素一會兒解釋。 //(4)處打印值 [p.myP,p.myP] //一個(gè)動態(tài)的HTMLCollection集合,長度為2,innerHTML分別為"hello dolby","hello bean"。
以上用刪除節(jié)點(diǎn)的方法驗(yàn)證了getElementsByClassName方法返回的是一個(gè)HTMLCollection動態(tài)集合。
⬆️以上代碼中,首先div取得了頁面中類名為"myDiv"的元素組成的動態(tài)集合,p取得了頁面中類名為"myP"的元素組成的動態(tài)集合,接著用一個(gè)for循環(huán)來刪除"myDiv"集合中第一項(xiàng)(即上例中唯一的div元素)中的"myP"集合中的每一項(xiàng),結(jié)果只有第一項(xiàng)和第三項(xiàng)被刪除了,這是為什么呢?
原因是動態(tài)集合中DOM結(jié)構(gòu)的變化能夠自動反映到所保存的對象中,最開始p.legth=4,當(dāng)i=0時(shí)刪除了頁面中第一個(gè)p元素,此后p.length=3;i=1時(shí)刪除了剩余的三個(gè)p中的項(xiàng)目索引為1的項(xiàng),此后p.length=2;i=2時(shí)已不滿足i<p.length這一條件,所以不會繼續(xù)執(zhí)行循環(huán)。至此只刪除了頁面上的第一和第三個(gè)p元素,所以打印p得到了一個(gè)長度為2的HTMLCollection動態(tài)集合,其中包含"hello dolby"和"hello bean",p的變化也實(shí)時(shí)反映到了動態(tài)集合div中,所以才有(1)處的打印結(jié)果。
那么怎樣才能遍歷類數(shù)組對象HTMLCollection集合中的每一項(xiàng)并且刪除所有項(xiàng)呢?
還是一個(gè)for循環(huán)搞定⬇️,每次刪除對象集合中的最后一項(xiàng)就可以啦~
//js代碼二 <script> var div = document.getElementsByClassName("myDiv")[0]; console.log(div); //(5) var p = document.getElementsByClassName("myP"); for (var i=p.length;i--;){ div.removeChild(p[i]); } console.log(p); //(6) </script>
//(5)處打印值 <div class="myDiv"></div> //(6)處打印值 [] //空的HTMLCollection集合,長度為0
3、getElementsByTagName():
接收一個(gè)參數(shù):要取得的元素的標(biāo)簽名(不區(qū)分大小寫),返回一個(gè)HTMLCollection動態(tài)集合(也可以說返回一個(gè)NodeList類數(shù)組對象),集合中包含以當(dāng)前元素為根節(jié)點(diǎn)(不包括當(dāng)前元素自身),所有指定標(biāo)簽名的子元素,子元素的順序是在當(dāng)前元素的子樹中出現(xiàn)的順序,如果沒有搜索到元素則集合為空。
語法:
elements = element.getElementsByTagName(tagName)
示例:
// check the alignment on a number of cells in a table. var table = document.getElementById("forecast-table"); var cells = table.getElementsByTagName("td"); for (var i = 0; i < cells.length; i++) { var status = cells[i].getAttribute("data-status"); if ( status == "open" ) { // grab the data } }
示例:刪除
<body> <div id="myDiv"> <p class="myP">hello world</p> <p class="myP">hello dolby</p> <p class="myP">hello dot</p> <p class="myP">hello bean</p> </div> <script> var div = document.getElementById("myDiv"); console.log(div); //(7) var p = document.getElementsByTagName("p"); //以下for循環(huán)改為for (var i=0,len=p.length;i<len;i++) {div.removeChild(p[0]);}也可;將集合p的長度賦值給變量len,這樣len就是一個(gè)固定值,每次都刪除當(dāng)前集合項(xiàng)目索引為0的項(xiàng),就可以循環(huán)遍歷刪除掉集合里的所有項(xiàng)。 for (var i=p.length;i--;){ div.removeChild(p[i]); } console.log(p); //(8) </script> </body>
與getElementByClassName相同,返回動態(tài)集合,所以循環(huán)刪除結(jié)果也相同
//(7)處打印值 <div id="myDiv"></div> //(8)處打印值 [] //空的HTMLCollection集合,長度為0
4、getElementsByName():
接收一個(gè)參數(shù):帶有給定name屬性值的元素,返回一個(gè)動態(tài)NodeList類數(shù)組對象,對象中包含以當(dāng)前元素為根節(jié)點(diǎn),所有指定name屬性值的子元素。最常用的場景是取得單選按鈕。
示例:
<!DOCTYPE html> <html lang="en"> <head> ... </head> <body> <form name="up"><input type="text"></form> <div name="down"><input type="text"></div> <script> var up_forms = document.getElementsByName("up"); console.log(up_forms[0].tagName); // returns "FORM" </script> </body> </html>
示例:刪除
<body> <div id="myDiv"> <input type="radio" name="fav-color">red <input type="radio" name="fav-color">green <input type="radio" name="fav-color">blue </div> <script> var div = document.getElementById("myDiv"); console.log(div); //(9) var ipt_favCol = document.getElementsByName("fav-color"); for (var i = ipt_favCol.length; i--;) { div.removeChild(ipt_favCol[i]); } console.log(ipt_favCol); //(10) </script> </body>
getElementByName返回的是一個(gè)NodeList動態(tài)集合
//(9)處打印值 <div id="myDiv"> "red" "green" "blue" </div> //(10)處打印值 [] //空的NodeList集合,長度為0
5、querySelector():
接收一個(gè)參數(shù):一個(gè)包含一個(gè)或多個(gè)CSS 選擇器的字符串(多個(gè)選擇器以逗號分隔),返回匹配指定CSS選擇器的第一個(gè)元素節(jié)點(diǎn)(無法選中CSS偽元素),沒有發(fā)現(xiàn)匹配的節(jié)點(diǎn)則返回null。
語法:
element = document.querySelector(selectors);
示例:一個(gè)強(qiáng)大的選擇方式
<div class="user-panel main"> <input name="login"/> //這個(gè)標(biāo)簽將被返回 </div> <script> var el = document.querySelector("div.user-panel.main input[name=login]"); </script>
示例:如果要匹配的ID或選擇器不符合 CSS 語法(比如不恰當(dāng)?shù)厥褂昧嗣疤柣蛘呖崭瘢?,你必須用反斜杠將這些字符轉(zhuǎn)義。由于 JavaScript 中,反斜杠是轉(zhuǎn)義字符,所以當(dāng)你輸入一個(gè)文本串時(shí),你必須將它轉(zhuǎn)義兩次(一次是為 JavaScript 字符串轉(zhuǎn)義,另一次是為 querySelector 轉(zhuǎn)義):
<div id="foo\bar"></div> <div id="foo:bar"></div> <script> console.log('#foo\bar') // "#fooar" document.querySelector('#foo\bar') // 不匹配任何元素 console.log('#foo\\bar') // "#foo\bar" console.log('#foo\\\\bar') // "#foo\\bar" document.querySelector('#foo\\\\bar') // 匹配第一個(gè)div document.querySelector('#foo:bar') // 不匹配任何元素 document.querySelector('#foo\\:bar') // 匹配第二個(gè)div </script>
示例:刪除
<div id="myDiv"> <p class="myP">hello world</p> <p class="myP">hello dolby</p> <p class="myP">hello dot</p> <p class="myP">hello bean</p> </div> <script> var div = document.getElementById("myDiv"); console.log(div); //(11) var p = document.querySelector("p"); div.removeChild(p); console.log(p); //(12) </script>
//(11)處打印值 <div id="myDiv"> <p class="myP">hello dolby</p> <p class="myP">hello dot</p> <p class="myP">hello bean</p> </div> //(12)處打印值 <p class="myP">hello world</p> //如你所見,querySelector也是靜態(tài)的快照
6、querySelectorAll():
接收一個(gè)參數(shù):一個(gè)包含一個(gè)或多個(gè)CSS 選擇器的字符串(多個(gè)選擇器以逗號分隔),返回靜態(tài)NodeList對象集合,該集合中包含匹配指定CSS選擇器的所有節(jié)點(diǎn),元素節(jié)點(diǎn)的變化無法實(shí)時(shí)反映在結(jié)果中;如果參數(shù)中包含CSS偽元素則返回一個(gè)空的對象集合。
語法:
elementList = document.querySelectorAll(selectors);
示例:
var matches = document.querySelectorAll("div.note, div.alert");
示例:刪除
<div id="myDiv"> <p class="myP">hello world</p> <p class="myP">hello dolby</p> <p class="myP">hello dot</p> <p class="myP">hello bean</p> </div> <script> var div = document.getElementById("myDiv"); console.log(div); //(13) var p = document.querySelectorAll("p"); for (var i = 0; i < p.length; i++) { div.removeChild(p[i]); } console.log(p); //(14) </script>
//(13)處打印值 <div id="myDiv"></div> //(13)處打印值 [p.myP,p.myP,p.myP,p.myP] //返回的是靜態(tài)NodeList集合,元素節(jié)點(diǎn)的變化無法實(shí)時(shí)反映在結(jié)果中
7、elementFromPoint():
接收兩個(gè)參數(shù):分別是相對于當(dāng)前窗口左上角的橫縱坐標(biāo),單位為CSS像素,不需要加單位;返回位于頁面指定位置的元素,如果該元素不可返回(如滾動條)則返回它的父元素,如果坐標(biāo)值無意義(如負(fù)值)則返回null。
語法
var element = document.elementFromPoint(x, y);
示例:
<!DOCTYPE html> <html lang="en"> <head> <title>elementFromPoint example</title> <script> function changeColor(newColor) { elem = document.elementFromPoint(2, 2); elem.style.color = newColor; } </script> </head> <body> <p id="para1">Some text here</p> <button onclick="changeColor('blue');">blue</button> <button onclick="changeColor('red');">red</button> </body> </html>
這一個(gè)獲取元素的方法用得不多所以不多做介紹。
是不是覺得看了上面這些頭好大啊,什么是動態(tài)什么是靜態(tài),有沒有好記一點(diǎn)的方法呢?
有噠!
你可以簡單地理解為,getElementBy系列返回的都是動態(tài)的HTMLCollection集合,動態(tài)集合中的DOM結(jié)構(gòu)變化能實(shí)時(shí)地反映到所保存的對象中,而querySelector系列返回的都是靜態(tài)的NodeList對象,是一個(gè)快照,對DOM的任何操作都不會對其產(chǎn)生影響。
那么Nodelist和HTMLCollection有什么異同呢?
相同點(diǎn):
你一定會好奇,誒?前面不是說querySelector系列返回的都是靜態(tài)的NodeList對象咩?怎么又變成動態(tài)的呢?原因在此:
規(guī)范中對 querySelectorAll 有明確要求,規(guī)定其必須返回一個(gè)靜態(tài)的 NodeList 對象。
在Chrome中情況如下:
document.querySelectorAll('a').toString(); // return "[object NodeList]" document.getElementsByTagName('a').toString(); // return "[object HTMLCollection]"
不同點(diǎn):
NodeList 對象會包含文檔中的所有節(jié)點(diǎn),如 Element、Text 和 Comment 等;HTMLCollection 對象只會包含文檔中的 Element 節(jié)點(diǎn)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
文章題目:淺談JS獲取元素的N種方法及其動靜態(tài)討論
轉(zhuǎn)載來于:http://aaarwkj.com/article0/iggpoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、App開發(fā)、網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)