DOM文檔對(duì)象模型簡(jiǎn)介

????最近學(xué)習(xí)過(guò)程中剛好接觸到了DOM,根據(jù)課上代碼的使用與老師講解大概了解了一下疼燥。課后我查了維基百科件余、MDN與阮一峰的JavaScript標(biāo)準(zhǔn)參考教程中關(guān)于DOM的介紹,加深了對(duì)DOM的了解肠虽。以下我對(duì)所查到資料與課上的筆記進(jìn)行整理幔戏,簡(jiǎn)單介紹一下DOM是個(gè)什么東西。畢竟剛剛才學(xué)到DOM税课,知識(shí)總結(jié)肯定不夠全面闲延,后續(xù)對(duì)DOM掌握到一定程度我會(huì)再重新整理修改一下。
  DOM(Document Object Model)文檔對(duì)象模型韩玩,是JavaScript操作網(wǎng)頁(yè)的接口垒玲。它的作用是將網(wǎng)頁(yè)轉(zhuǎn)為一個(gè)JavaScript對(duì)象,從而可以用腳本進(jìn)行各種增刪減改內(nèi)容的操作找颓。
  瀏覽器會(huì)根據(jù)DOM模型將HTML文檔解析成一系列的節(jié)點(diǎn)(node:DOM的最小組成單位)合愈,再由這些節(jié)點(diǎn)組成一個(gè)樹狀結(jié)構(gòu)(DOM tree)』魇ǎ或者也可以這么說(shuō)佛析,DOM模型用一個(gè)邏輯樹表示一個(gè)文檔,樹的每個(gè)分支的終點(diǎn)都是一個(gè)節(jié)點(diǎn)(node)彪蓬,每個(gè)節(jié)點(diǎn)都包含著對(duì)象(Object)寸莫。DOM的方法可以讓你用特定的方式操作這個(gè)樹,用這些方法可以改變文檔結(jié)構(gòu)档冬、樣式以及內(nèi)容膘茎。所有的節(jié)點(diǎn)和最終的樹狀結(jié)構(gòu)都有規(guī)范的對(duì)外接口(API)。
  注意:DOM并不是一個(gè)編程語(yǔ)言捣郊,它只是一個(gè)接口規(guī)范辽狈,可以用各種語(yǔ)言實(shí)現(xiàn)。DOM并不是JavaScript語(yǔ)法的一部分呛牲,但是如果沒(méi)有DOM刮萌,JavaScript語(yǔ)言就沒(méi)有辦法控制網(wǎng)頁(yè)。

  • 節(jié)點(diǎn)類型(nodeType)
  • 節(jié)點(diǎn)的類型有七種:
    Document(Node.DOCUMENT_NODE === 9):整個(gè)文檔樹的頂層節(jié)點(diǎn)
    DocumentType(Node.DOCUMENT_TYPE_NODE === 10):doctype標(biāo)簽(比如<!DOCTYPE html>)
    Element(Node.ELEMENT_NODE === 1):網(wǎng)頁(yè)的各種HTML標(biāo)簽(比如<body>娘扩、<a>等)
    Attribute:網(wǎng)頁(yè)元素的屬性(比如class="right")
    Text(Node.TEXT_NODE === 3):標(biāo)簽之間或標(biāo)簽包含的文本
    Comment(Node.COMMENT_NODE === 8):注釋
    DocumentFragment(Node.DOCUMENT_FRAGMENT_NODE === 1):文檔的片段

瀏覽器提供一個(gè)原生的節(jié)點(diǎn)對(duì)象Node着茸,上面這七種節(jié)點(diǎn)都繼承了Node壮锻,因此具有一些共同的屬性和方法。

節(jié)點(diǎn)(Node)有一個(gè)屬性nodeType表示Node的類型涮阔,它是一個(gè)整數(shù)猜绣,其數(shù)值分別表示相應(yīng)的Node類型。
根據(jù)以上知識(shí)如果我們需要判斷一個(gè)Node是否是元素敬特,可以如以下代碼所示判斷:
if(Node.nodeType === 1){
  console.log('Node is a Element');
}
  • 常用的DOM操作API
1.creatElement

createElement通過(guò)傳入指定的一個(gè)標(biāo)簽名來(lái)創(chuàng)建一個(gè)元素掰邢,代碼如下:

var div = document.creatElement('div')

上面代碼新建一個(gè)<div>的節(jié)點(diǎn)

2.appendChild

appendChild接受一個(gè)節(jié)點(diǎn)對(duì)象作為參數(shù),將其作為最后一個(gè)子節(jié)點(diǎn)伟阔,插入當(dāng)前節(jié)點(diǎn)辣之。該方法的返回值就是插入文檔的子節(jié)點(diǎn)。代碼如下:

var div = document.createElement('div');
document.body.appendChild(div);

上面代碼新建一個(gè)<div>的節(jié)點(diǎn)并將其插入document.body的尾部皱炉。

3.nodeName

nodeName屬性返回節(jié)點(diǎn)的名稱怀估。

// HTML 代碼如下
// <div id="div1">hello world</div>
var div = document.getElementById('div1');
div.nodeName // "DIV"

上面代碼中,元素節(jié)點(diǎn)<div>nodeName屬性就是大寫的標(biāo)簽名DIV合搅。
如果想要得到小寫的標(biāo)簽名多搀,則可修改為:div.nodeName.lowercase()

4.textContent

textContent屬性返回當(dāng)前節(jié)點(diǎn)和它的所有后代節(jié)點(diǎn)的文本內(nèi)容。

// HTML 代碼為
// <div id="divA">This is <span>some</span> text</div>
document.getElementById('divA').textContent
// This is some text

textContent屬性自動(dòng)忽略當(dāng)前節(jié)點(diǎn)內(nèi)部的 HTML 標(biāo)簽灾部,返回所有文本內(nèi)容康铭。它的屬性是可讀寫的,給該屬性一個(gè)值梳猪,會(huì)創(chuàng)建一個(gè)新的文本節(jié)點(diǎn)麻削,替換所有原來(lái)的子節(jié)點(diǎn)。它還有一個(gè)好處春弥,就是自動(dòng)對(duì) HTML 標(biāo)簽轉(zhuǎn)義。

document.getElementById('divA').textContent = 'Hello World' 
// 原先div內(nèi)容被修改為Hello World
5.nextSibling

nextSibling屬性返回緊跟在當(dāng)前節(jié)點(diǎn)后面的第一個(gè)同級(jí)節(jié)點(diǎn)叠荠。如果當(dāng)前節(jié)點(diǎn)后面沒(méi)有同級(jí)節(jié)點(diǎn)匿沛,則返回null
注意:如果當(dāng)前節(jié)點(diǎn)后面有空格榛鼎,那我們拿到的節(jié)點(diǎn)便是文本節(jié)點(diǎn)逃呼,與預(yù)期的不符,故需要進(jìn)行處理一下者娱,使用while循環(huán)遍歷所有子節(jié)點(diǎn)來(lái)找出正確的節(jié)點(diǎn)抡笼。

6.previousSibling

previousSibling屬性返回當(dāng)前節(jié)點(diǎn)前面的、距離最近的一個(gè)同級(jí)節(jié)點(diǎn)黄鳍。如果當(dāng)前節(jié)點(diǎn)前面沒(méi)有同級(jí)節(jié)點(diǎn)推姻,則返回null
注意:previousSibling與nextSibling注意點(diǎn)相同框沟。

7.parentNode與parentElement

  對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō)藏古,它的父節(jié)點(diǎn)只可能是三種類型:元素節(jié)點(diǎn)(element)增炭、文檔節(jié)點(diǎn)(document)和文檔片段節(jié)點(diǎn)(documentfragment)。
parentNode屬性返回當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)拧晕。
parentElement屬性返回當(dāng)前節(jié)點(diǎn)的父元素節(jié)點(diǎn)隙姿。

8.firstChild與lastChild

firstChild屬性返回當(dāng)前節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn),如果當(dāng)前節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)厂捞,則返回null输玷。
lastChild屬性返回當(dāng)前節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn),如果當(dāng)前節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)靡馁,則返回null饲嗽。用法與firstChild屬性相同。

// HTML 代碼如下
// <p id="p1"><span>First span</span></p>
var p1 = document.getElementById('p1');
p1.firstChild.nodeName // "SPAN"

上面代碼中奈嘿,p元素的第一個(gè)子節(jié)點(diǎn)是span元素貌虾。
注意:firstChild返回的除了元素節(jié)點(diǎn),還可能是文本節(jié)點(diǎn)或注釋節(jié)點(diǎn)裙犹。

9.childNodes

childNodes屬性返回一個(gè)類似數(shù)組的對(duì)象(NodeList集合)尽狠,成員包括當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)。使用該屬性中返回的length值叶圃,可以遍歷某個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)袄膏。

var div = document.getElementById('div1');
var children = div.childNodes;

for (var i = 0; i < children.length; i++) {
  // ...
}

注意:除了元素節(jié)點(diǎn),childNodes屬性的返回值還包括文本節(jié)點(diǎn)和注釋節(jié)點(diǎn)掺冠。如果當(dāng)前節(jié)點(diǎn)不包括任何子節(jié)點(diǎn)沉馆,則返回一個(gè)空的NodeList集合。由于NodeList對(duì)象是一個(gè)動(dòng)態(tài)集合德崭,一旦子節(jié)點(diǎn)發(fā)生變化斥黑,立刻會(huì)反映在返回結(jié)果之中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眉厨,一起剝皮案震驚了整個(gè)濱河市锌奴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌憾股,老刑警劉巖鹿蜀,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異服球,居然都是意外死亡茴恰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門斩熊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)往枣,“玉大人,你說(shuō)我怎么就攤上這事⊥裆蹋” “怎么了似忧?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)丈秩。 經(jīng)常有香客問(wèn)我盯捌,道長(zhǎng),這世上最難降的妖魔是什么蘑秽? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任饺著,我火速辦了婚禮,結(jié)果婚禮上肠牲,老公的妹妹穿的比我還像新娘幼衰。我一直安慰自己,他們只是感情好缀雳,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布渡嚣。 她就那樣靜靜地躺著,像睡著了一般肥印。 火紅的嫁衣襯著肌膚如雪识椰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天深碱,我揣著相機(jī)與錄音腹鹉,去河邊找鬼。 笑死敷硅,一個(gè)胖子當(dāng)著我的面吹牛功咒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绞蹦,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼力奋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坦辟?” 一聲冷哼從身側(cè)響起刊侯,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锉走,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藕届,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挪蹭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了休偶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梁厉。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出词顾,到底是詐尸還是另有隱情八秃,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布肉盹,位于F島的核電站昔驱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏上忍。R本人自食惡果不足惜骤肛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窍蓝。 院中可真熱鬧腋颠,春花似錦、人聲如沸吓笙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)面睛。三九已至絮蒿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侮穿,已是汗流浹背歌径。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亲茅,地道東北人回铛。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像克锣,于是被迫代替她去往敵國(guó)和親茵肃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容