DOM是所有前端開發(fā)每天打交道的東西,但是隨著jQuery等庫的出現(xiàn),大大簡化了DOM操作,導(dǎo)致大家慢慢的“遺忘”了它的本來面貌 。不過,要想深入學(xué)習(xí)前端知識,對DOM的了解是不可或缺的,所以本文力圖系統(tǒng)的講解下DOM的相關(guān)知識,如有遺漏或錯(cuò)誤,還請大家指出一起討論^ ^ 。
一、DOM是什么?
DOM(文檔對象模型)是針對HTML和XML文檔的一個(gè)API,通過DOM可以去改變文檔 。
這個(gè)說法很官方,大家肯定還是不明白 。
舉個(gè)例子:我們有一段HTML,那么如何訪問第二層第一個(gè)節(jié)點(diǎn)呢,如何把最后一個(gè)節(jié)點(diǎn)移動到第一個(gè)節(jié)點(diǎn)上面去呢?
DOM就是定義了如果做類似操作,那么應(yīng)該怎么做的標(biāo)準(zhǔn) 。比如用getElementById來訪問節(jié)點(diǎn),用insertBefore來插入節(jié)點(diǎn) 。
當(dāng)瀏覽器載入HTML時(shí),會生成相應(yīng)的DOM樹 。
簡而言之,DOM可以理解為一個(gè)訪問或操作HTML各種標(biāo)簽的實(shí)現(xiàn)標(biāo)準(zhǔn) 。每一段HTML標(biāo)記都可以用相應(yīng)的節(jié)點(diǎn)表示,例如:
對于一個(gè)HTML來說,文檔節(jié)點(diǎn)Document(看不到的)是它的根節(jié)點(diǎn),對應(yīng)的對象便是document對象(嚴(yán)格講是子類HTMLDocument對象,下面單獨(dú)介紹Document類型時(shí)會指出) 。
換句話說存在一個(gè)文檔節(jié)點(diǎn)Document,然后它有子節(jié)點(diǎn),比如通過
document.getElementsByTagName(“html”),得到類型為元素節(jié)點(diǎn)的Element html 。
HTML元素通過元素節(jié)點(diǎn)表示,注釋通過注釋節(jié)點(diǎn)表示,文檔類型通過文檔類型節(jié)點(diǎn)表示等 。
一共定義了12種節(jié)點(diǎn)類型,而這些類型又都繼承自Node類型 。
所以我們首先講Node類型,因?yàn)檫@個(gè)類型的方法是所有節(jié)點(diǎn)都會繼承的 。
二、Node類型(基類,所有節(jié)點(diǎn)都繼承了它的方法)
Node是所有節(jié)點(diǎn)的基類型,所有節(jié)點(diǎn)都繼承自它,所以所有節(jié)點(diǎn)都有一些共同的方法和屬性 。
先講Node類型的屬性
首先是nodeType屬性,用來表明節(jié)點(diǎn)類型的,例如:
document.nodeType; // 返回 9 ,其中document對象為文檔節(jié)點(diǎn)Document的實(shí)例 這里面,9代表的就是DOCUMENT_NODE節(jié)點(diǎn)的意思,可以通過Node.DOCUMENT_NODE查看節(jié)點(diǎn)對應(yīng)的數(shù)字
document.nodeType === Node.DOCUMENT_NODE; // true 至于一共有哪些節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)對應(yīng)的數(shù)字又是多少,這個(gè)可以問谷歌就知道了 。反正常用的就是元素節(jié)點(diǎn)Element(對應(yīng)數(shù)字為1)和文本節(jié)點(diǎn)Text(對應(yīng)數(shù)字為3)
然后常用的還有nodeName和nodeValue
對于元素節(jié)點(diǎn) nodeName就是標(biāo)簽名,nodeValue就是null
對于文本節(jié)點(diǎn) nodeName為”#text”(chrome里面測試的),nodeValue就是實(shí)際的值
每個(gè)節(jié)點(diǎn)還有childNodes屬性,這是個(gè)十分重要的屬性,它保存了這個(gè)節(jié)點(diǎn)所有直接子元素
調(diào)用childNodes返回的是一個(gè)NodeList對象,它極其像數(shù)組,但是有一個(gè)最關(guān)鍵的地方,它是動態(tài)查詢的,也就是說每次調(diào)用它都會對DOM結(jié)構(gòu)查詢,所以對它的使用需要慎重,注意性能 。
訪問childNodes可以使用數(shù)組下表或者item方法
然后各個(gè)節(jié)點(diǎn)還存在各種屬性讓它們可以相互訪問,下圖很好的總結(jié)了
比較有用的方法和屬性:
1、hasChildNodes()
如果包含子節(jié)點(diǎn)就返回true,比查詢childNodes的length來的簡單 。
2、ownerDocument
返回文檔節(jié)點(diǎn)的引用(在html里面也就是document對象)
再介紹下Node類型常用的方法
appendChild()方法可以在節(jié)點(diǎn)的childNodes的末尾增加一個(gè)節(jié)點(diǎn),值得注意的是如果這個(gè)節(jié)點(diǎn)是已經(jīng)存在在文檔中的,那么便會刪除原節(jié)點(diǎn),感覺上就像是移動節(jié)點(diǎn)一樣 。
insertBefore()方法接受兩個(gè)參數(shù),一個(gè)是插入的節(jié)點(diǎn),另外一個(gè)是參照的節(jié)點(diǎn) 。如果第二個(gè)參數(shù)為null,則insertBefore和appendChild效果一樣 。否則便會把節(jié)點(diǎn)插入到參照節(jié)點(diǎn)之前 。這里要注意的是,如果第二個(gè)參數(shù)不為null,那么插入的節(jié)點(diǎn)不能是已經(jīng)存在的節(jié)點(diǎn) 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時(shí)就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 蜂王漿是什么
- 十種方法增強(qiáng)記憶力是什么呢
- 絕對值最小的有理數(shù) 絕對值最小的有理數(shù)是什么數(shù)
- 一蹴而就的意思是什么 一蹴而就的意思是什么啊
- 連長是什么軍銜 一個(gè)連的編制是多少人
- 儒家思想的核心主張是什么 儒家及其代表性人物
- smt是什么意思和流水線哪個(gè)輕松 smt貼片元器件是什么意思
- 大雁往南飛是什么季節(jié)
- 饃饃上點(diǎn)的紅色是什么
- 生源地是什么意思?生源地一般寫到縣還是市
