成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從DOM選擇器的返回值說起

lmxdawn / 3188人閱讀

摘要:原文發(fā)布在我的獨(dú)立博客上從選擇器的返回值說起拋開大大解放生產(chǎn)力的,使用獲取元素要使用方法,或類似的,第一種情況下,根據(jù)獲取時(shí),返回值是唯一的元素而根據(jù)等獲取時(shí)候,返回值是包含所有符合條件的多個(gè)元素的列表。

  

原文發(fā)布在我的獨(dú)立博客上 ~: 從DOM選擇器的返回值說起

拋開大大解放生產(chǎn)力的jQuery,使用JS獲取元素要使用getElementById方法,或類似的getElementsByTagName, getElementsByClassName,getElementsByName. 第一種情況下,根據(jù)ID獲取時(shí),返回值是唯一的元素;而根據(jù)TagName, ClassName 等獲取時(shí)候,返回值是包含所有符合條件的多個(gè)元素的“列表”。此處“列表”要加雙引號(hào),是因?yàn)閲?yán)格來說,JavaScript乃至DOM元素中并沒有所謂“列表”或List的數(shù)據(jù)類型/對(duì)象,既然不能稱為列表,那么它們到底是啥?

這篇blog就試圖從getElement(s)的返回值說起,往上扯一些早就該了解,但總是似懂非懂的簡(jiǎn)單的DOM基礎(chǔ)知識(shí)。

getElements方法的返回值

getElementsByClassName("myClass")獲取指定類名為myClass的元素,getElementsByTagName("some-tag")獲取標(biāo)簽為"some-tag"的元素,它們的返回值都是 HTMLCollection 對(duì)象

getElementsByName("myName")獲取標(biāo)記了name屬性為myName的元素,它的返回值是NodeList對(duì)象

getElementById("myId")獲取唯一id屬性為myId的元素。有趣的是,當(dāng)訪問該元素的constructor.name屬性時(shí),可以得到不同的值。form元素對(duì)應(yīng)HTMLFormElement對(duì)象, main標(biāo)簽則對(duì)應(yīng)HTMLElement對(duì)象,這應(yīng)該是從面向?qū)ο蟮慕嵌瓤矗煌愋偷脑貙儆诓煌膶?duì)象實(shí)例。

querySelectorquerySelectorAll方法是HTML5新增的Web API,它們接受selector參數(shù),selector正是我們常用的CSS選擇器。不同之處在于,querySelector("form")返回的是頁(yè)面中的第一個(gè)"form"元素,而querySelectorAll("form")返回NodeList類型,它們是所有form的列表。

NodeList與HTMLCollection

接著來看這兩個(gè)對(duì)象,它們都由多個(gè)元素組成一個(gè)“列表”,或者說“數(shù)組”,我們也可以像使用數(shù)組一樣方便地用下標(biāo)訪問單個(gè)元素。但是它們僅僅是Array-like,并沒有Array對(duì)象的其他常用方法,比如forEach.

javascriptvar buttons = document.getElementsByTagName("button");
console.log(buttons[1]);  // 輸出第2個(gè)button元素
console.log(buttons.forEach); // undefied
console.log(buttons.filter); //undefied

var next_nodes = document.getElementsByName("next");
console.log(next_nodes[0]); //輸出列表中第1個(gè)元素
console.log(next_nodes.forEach);    //undefied

除了以上提到的getElements方法之外

NodeList也是Node.childNodes, document.querySelector的返回值類型

HTMLCollection也是Node.children, document.forms等的對(duì)象類型

在使用getElements方法時(shí),NodeList和HTMLCollection好像并沒什么不一一樣的,但是從字面上講,一個(gè)是節(jié)點(diǎn)列表,一個(gè)是HTML(元素)集合,并不是一回事。他們的不同可以從另外兩個(gè)方法看出,它們是childNodes和children,下面是一個(gè)合適的例子。

Node.childNodes與Node.children的區(qū)別
html
text in div Link Strong Text Strong Link
javascriptmydiv = document.querySelector("div");
console.log(mydiv.children);    // 不含#text "text in div"和注釋
console.log(mydiv.childNodes);  // 含文字"text in div"和注釋

mydiv.children獲得的,是

的子標(biāo)簽代表的元素,所以示例中的text in span并不屬于span.children

mydiv.childNodes獲得的,是包含文本內(nèi)容在內(nèi)的所有子節(jié)點(diǎn)。所謂節(jié)點(diǎn),正是瀏覽器在構(gòu)造DOM樹的每一個(gè)不可或缺的元素,當(dāng)然少不了必須的文本節(jié)點(diǎn)。

所以它們不同就在于一個(gè)獲取的是元素,一個(gè)獲取所有節(jié)點(diǎn)。

從Element到Node到DOM

到底元素和節(jié)點(diǎn)有什么不同,看原型鏈。

元素為例,調(diào)用mydiv.children[0].constructor.name,可知Link元素的類型HTMLAnchorElement; HTMLAnchorElement的原型鏈為:

HTMLAnchorElement --> HTMLElement --> Element --> Node --> EventTarget --> Object

調(diào)用mydiv.childNodes[0].constructor.name,可知節(jié)點(diǎn)的對(duì)象類型Comment,類似也可以得到文本節(jié)點(diǎn)的類型Text,它們的原型鏈為:

Comment --> CharacterData --> Node --> EventTarget --> Object
Text --> CharacterData -- Node -- EventTarget --> Object

看到原型鏈就可以豁然開朗了,Node是包含Element和Text, Comment在內(nèi)的概念,而HTMLElement只是Node的一個(gè)子集。

除了上面示例的幾個(gè)節(jié)點(diǎn)類型,Node包含的類型如下;對(duì)任意一個(gè)節(jié)點(diǎn)myNode,myNode.nodeType屬性就是它的類型。

圖片截自 MDN, thumb down圖標(biāo)代表廢棄API,是不推薦使用的類型

終于扯到最基本的DOM概念了,DOM事關(guān)重大,然而原理其實(shí)也就是兩句話的事兒。

DOM == Document Object Modle(文檔結(jié)構(gòu)模型),瀏覽器收到一個(gè)HTML頁(yè)面后,根據(jù)頁(yè)面結(jié)構(gòu)構(gòu)建一個(gè)DOM樹,DOM樹就是由不同類型的節(jié)點(diǎn)(Node)所組成的。在HTML文檔中,一條注釋語(yǔ)句是一個(gè)Node,一個(gè)HTML元素也是Node,甚至也是一個(gè)Node。有了Node對(duì)象,一生二,二生三,三生萬(wàn)物;除了事件和ajax請(qǐng)求,前端編程說白了就剩下來使用瀏覽器提供的DOM API來對(duì)Node進(jìn)行各種操作。

當(dāng)然,觀察Node的原型鏈,可以看到處于它上一層的是 EventTarget對(duì)象,這意味著Node都繼承了EventTarget的屬性和方法,最常見的當(dāng)然是.addEventListener。這正是javascript在前端能夠?qū)崿F(xiàn)各種可能性的原因,一切節(jié)點(diǎn)都可以綁定事件。

參考:
1. DOM概述 | MDN
2. Node - Web API Interfaces | MDN
3. NodeList - Web API Interfaces | MDN
4. HTML5中類jQuery選擇器querySelector的使用 - SegmentFault

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85686.html

相關(guān)文章

  • 前端性能優(yōu)化css說起

    摘要:放在中減少引起和接下來我們?cè)賮碛懻撘幌聢D片與雪碧圖或精靈,在網(wǎng)頁(yè)中我們會(huì)用到很多圖標(biāo),如果每一個(gè)圖標(biāo)是單獨(dú)的一張圖片,那網(wǎng)頁(yè)加載的時(shí)候,就會(huì)有多個(gè)請(qǐng)求去請(qǐng)求圖片,顯而易見會(huì)影響網(wǎng)頁(yè)性能,所以要采取方法對(duì)網(wǎng)頁(yè)中圖標(biāo)使用進(jìn)行優(yōu)化處理。 ???????我們都知道性能對(duì)于一個(gè)網(wǎng)站來說相當(dāng)重要,以至于很多公司都會(huì)專門招聘人員優(yōu)化網(wǎng)站性能,網(wǎng)上關(guān)于探討網(wǎng)站性能優(yōu)化的文章也非常多。性能是什么呢?簡(jiǎn)單...

    KoreyLee 評(píng)論0 收藏0
  • 前端性能優(yōu)化css說起

    摘要:放在中減少引起和接下來我們?cè)賮碛懻撘幌聢D片與雪碧圖或精靈,在網(wǎng)頁(yè)中我們會(huì)用到很多圖標(biāo),如果每一個(gè)圖標(biāo)是單獨(dú)的一張圖片,那網(wǎng)頁(yè)加載的時(shí)候,就會(huì)有多個(gè)請(qǐng)求去請(qǐng)求圖片,顯而易見會(huì)影響網(wǎng)頁(yè)性能,所以要采取方法對(duì)網(wǎng)頁(yè)中圖標(biāo)使用進(jìn)行優(yōu)化處理。 ???????我們都知道性能對(duì)于一個(gè)網(wǎng)站來說相當(dāng)重要,以至于很多公司都會(huì)專門招聘人員優(yōu)化網(wǎng)站性能,網(wǎng)上關(guān)于探討網(wǎng)站性能優(yōu)化的文章也非常多。性能是什么呢?簡(jiǎn)單...

    shiyang6017 評(píng)論0 收藏0
  • Xpath、Jsoup、Xsoup(我的Java爬蟲之二)

    摘要:它最主要的目的是為了在或文檔節(jié)點(diǎn)樹中定位節(jié)點(diǎn)所設(shè)計(jì)。選取所有擁有名為的屬性的元素。選取元素的所有元素,且其中的元素的值須大于。實(shí)例路徑表達(dá)式結(jié)果選取元素的所有子元素。如在加載文件的時(shí)候發(fā)生錯(cuò)誤,將拋出,應(yīng)作適當(dāng)處理。 從Xpath說起 什么是Xpath XPath是W3C的一個(gè)標(biāo)準(zhǔn)。它最主要的目的是為了在XML1.0或XML1.1文檔節(jié)點(diǎn)樹中定位節(jié)點(diǎn)所設(shè)計(jì)。XPath是一種表達(dá)式語(yǔ)言,...

    Big_fat_cat 評(píng)論0 收藏0
  • closest() 方法獲得匹配選擇器的第一個(gè)祖先元素

    摘要:當(dāng)被最接近的列表元素或其子后代元素被點(diǎn)擊時(shí),會(huì)切換黃色背景定義和用法方法獲得匹配選擇器的第一個(gè)祖先元素,從當(dāng)前元素開始沿樹向上。詳細(xì)說明如果給定表示元素集合的對(duì)象,方法允許我們檢索樹中的這些元素以及它們的祖先元素,并用匹配元素構(gòu)造新的對(duì)象。 w3c: http://www.w3school.com.cn/jquery/traversing_closest.asp 本例演示如何通過 c...

    seanlook 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<