Javascript中的Dom概念和Node類型(一)

一、Dom的概念和節(jié)點層次

Dom:Document Object Model 文檔對象模型坪圾,可以將任何 html 文檔描繪成一個由多層次節(jié)點構成的結(jié)構致稀。換而言之,就是Dom會把文檔看成一棵樹稼稿,同時定義很多方法來操作這棵樹中的每一個元素(節(jié)點)。

文檔:html 頁面

文檔對象:頁面中的元素

文檔對象模型:為了能夠讓程序(js)去操作頁面中的元素

文檔節(jié)點:文檔節(jié)點是每個文檔的根節(jié)點讳窟,文檔節(jié)點只有一個子節(jié)點让歼,即<html>元素,我們稱為文檔元素丽啡,文檔元素是文檔的最外層元素谋右,文檔中其他所有元素都包含在文檔元素中,每個文檔都只能有一個文檔元素补箍,在 html 頁面中改执,文檔元素始終是<html>元素。

二馏予、Node類型

js中所有節(jié)點的類型都繼承自 Node 類型天梧。
共有12種類型,用12個數(shù)值來表示霞丧。

1.nodeType :返回節(jié)點的節(jié)點類型

節(jié)點類型

我們只需要注意前三種即可呢岗,其他了解就好
元素節(jié)點 : 1
屬性節(jié)點 : 2
文本節(jié)點 : 3

if(someNode.nodeType  ==1){
  alert(“Node is an element!”)
}

2.nodeName 和 nodeValue

nodeName :元素的標簽名
nodeValue:始終為null

if(someNode.nodeType  ==1){
  value = someNode.nodeName  //元素的標簽名 
}

在這個例子中,首先檢查節(jié)點類型蛹尝,看它是不是一個元素后豫,如果是,則取得nodeName的值突那。

三挫酿、節(jié)點關系

1.childNodes 子節(jié)點列表集合,(只讀屬性)

每個節(jié)點都有一個 childNodes 屬性愕难,其中保存著一個NodeList對象(類數(shù)組對象)早龟,用來保存一組有序的節(jié)點,可以通過位置來訪問這些節(jié)點猫缭。
注意:
1.是對象下的一種屬性
2.使用時不加括號
3.只包含一級子節(jié)點葱弟,不包含后輩孫級以下的節(jié)點
4.標準下:包含了文本和元素類型的節(jié)點,也會包含非法嵌套的子節(jié)點
5.非標準下:只包含元素類型的節(jié)點猜丹,ie7以下不會包含非法嵌套子節(jié)點

 var firstChild = someNode.childNodes[0];
var secondChild = someNode.childNodes[1];
//var secondChild = someNode.childNodes.item(1);
vat count = someNode.childNodes.length;
<script>
window.onload = function() {
    var oUl = document.getElementById('ul1');
    alert( oUl.childNodes.length );
      //標準下為11芝加,ie7以下為4(因為包括了文本節(jié)點和非法節(jié)點,ie7以下不識別)
}
</script>
<ul id="ul1" style="border: 1px solid red;">
        <li>11111</li>
        <li>22222</li>
        <li>33333</li>
        <li>44444</li>
        <p>pppppppp</p>
    </ul>

2.parentNode : 當前節(jié)點的父級節(jié)點(只讀屬性)

<script>
window.onload = function() {
    
    var aA = document.getElementsByTagName('a');
    
    for (var i=0; i<aA.length; i++) {
        aA[i].onclick = function() {
            this.parentNode.style.display = 'none'; 
            //當點擊標簽a時射窒,li隱藏
        }
    }
    
    
}
</script>

<body>
    <ul id="ul1">
        <li>11111 <a href="javascript:;">隱藏</a></li>
        <li>22222 <a href="javascript:;">隱藏</a></li>
        <li>33333 <a href="javascript:;">隱藏</a></li>
        <li>44444 <a href="javascript:;">隱藏</a></li>
    </ul>
</body>

3.previousSibling 和 nextSibling

注意:
1.可以訪問同一列表的其他節(jié)點
2.列表中的第一個節(jié)點 previousSibling 屬性值為null
3.列表中最后一個節(jié)點 nextSibling 屬性值為null
4.如果列表中只有一個節(jié)點藏杖,那么該節(jié)點的 previousSibling 和 nextSibling 都為null

4.firstChild : 第一個子節(jié)點 (只讀屬性)

lastChild:最后一個節(jié)點 (只讀屬性)

注意:
1.標準下:firstChild 和lastChild會包含文本類型的節(jié)點
2.非標準下:只包含元素節(jié)點
3.在只有一個節(jié)點的情況下将塑,firstChild 和lastChild 指向同一個節(jié)點
4.如果沒有子節(jié)點,firstChild 和lastChild 均為null

var oUl = document.getElementById('ul1');
    alert( oUl.firstChild );   //[object Text]  文本節(jié)點
<ul id="ul1">
        <li>11111</li>
        <li>22222</li>
        <li>33333</li>
        <li>44444</li>
    </ul>
<script>
window.onload = function() {
    
    var oUl = document.getElementById('ul1');
    
    var oFirst = oUl.firstChild;
    oFirst.style.background = 'red';

    var oLast = oUl.lastChild;
    oLast.style.background = 'yellow';
    
    var oNext = oFirst.nextSibling;
    oNext.style.background = 'blue';

    var oPrev = oLast.previousSibling;
    oPrev.style.background = 'orange';
    //結(jié)果打開頁面沒有變化蝌麸,因為他們的操作都會基于文本節(jié)點点寥,文本節(jié)點沒有style屬性,所以不會有變化
}
</script>

<body>
    <ul id="ul1">
        <li>11111</li>
        <li>22222</li>
        <li>33333</li>
        <li>44444</li>
    </ul>
</body>

解析:打開頁面沒有變化祥楣,因為他們的操作都會基于文本節(jié)點开财,文本節(jié)點沒有style屬性,所以不會有變化

5.hasChildNodes()

在節(jié)點包含一個或多個子節(jié)點的情況下返回true误褪,比查詢childNodes列表的length更簡便

6.ownerDocument 指向表示整個文檔的文檔節(jié)點

表示任何節(jié)點都屬于它所在的文檔,任何節(jié)點都不能同時存在于兩個或者更多個文檔中碾褂,這個屬性兽间,可以直接訪問文檔節(jié)點

四、基本節(jié)點操作方法

1.appendChild(要添加的元素) [方法] 追加子元素

用于在ChildNodes列表的末尾添加一個節(jié)點正塌,添加節(jié)點后嘀略,ChildNodes 的新增節(jié)點,父節(jié)點以及以前的最后一個節(jié)點的關系指針都會相應的得到更新乓诽。

var oUl = document.getElementById('ul1');
var oLi = document.createElement('li');     
<body>
    <input type="text" id="text1" /><input type="button" value="留言" id="btn" />
    <ul id="ul1"></ul>
</body>

結(jié)果如下圖:


appendChild

2.insertBefore(新的元素帜羊,被插入的元素) [方法]

將節(jié)點放在某個特定的位置

<script>
window.onload = function() {

    var oUl = document.getElementById('ul1');
    var oLi = document.createElement('li');
    oUl.insertBefore( oLi, oUl.children[0] );
    
}
</script>

<body>
    <ul id="ul1">
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
</body>

結(jié)果如圖所示


insertBefore

3.replaceChild(要插入的節(jié)點,被替換節(jié)點) 替換子節(jié)點 [方法]

要替換的節(jié)點將這個方法返回并從文檔樹中刪除鸠天,同時由要插入的節(jié)點占據(jù)其位置

<script>
window.onload = function() {
    
    var oDiv = document.getElementById('div1');
    var oBtn = document.getElementById('btn');
    var oP = document.getElementById('p1');
    oBtn.onclick = function() {

        document.body.replaceChild( oDiv, oP );
    //當點擊按鈕后讼育,p標簽被div標簽替換
    }
    
}
</script>

<body>
    <div id="div1">div1</div>
    <input type="button" value="按鈕" id="btn" />
    <hr />
    <p id="p1">ppppp</p>
</body>

removeChild(要刪除的元素); 刪除元素 [方法]

被移除的節(jié)點稱為該方法的返回值

<script>
window.onload = function() {

    var oUl = document.getElementById('ul1');
    var oLi = document.getElementsByTagName('li')[0];
    var child = oUl.removeChild( oLi);
        
}
</script>

<body>
    <ul id="ul1">
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
</body>

結(jié)果如圖:


removeChild

五、其他操作方法

1.cloneNode()用于創(chuàng)建調(diào)用這個方法的節(jié)點的一個完全相同的副本 [方法]

該方法接收一個布爾值參數(shù)稠集,表示是否執(zhí)行深復制
參數(shù)為true奶段,執(zhí)行深復制,即復制節(jié)點及整個子節(jié)點樹
參數(shù)為false剥纷,執(zhí)行淺復制痹籍,即只復制該節(jié)點本身

<script>
window.onload = function() {

    var oUl = document.getElementById('ul1');
    
    var deepList = oUl.cloneNode(true);
    alert(deepList.childNodes.length);  //7

    var shallowList = oUl.cloneNode(false);
    alert(shallowList.childNodes.length);  //0
        
}
</script>

<body>
    <ul id="ul1">
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
</body>

2.normalize(),處理文檔樹中的文本節(jié)點

當由于解析器的實現(xiàn)或Dom操作等原因,可能會出現(xiàn)文本節(jié)點不包括文本晦鞋,或者接連出現(xiàn)兩個文本節(jié)點的情況蹲缠,當在某個節(jié)點上調(diào)用該方法時,就會在該節(jié)點的后代節(jié)點上查找上述兩種情況悠垛,如果找到了空文本節(jié)點线定,則刪除它;如果找到相鄰的文本節(jié)點鼎文,則將它們合并為一個文本節(jié)點渔肩。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拇惋,隨后出現(xiàn)的幾起案子周偎,更是在濱河造成了極大的恐慌抹剩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蓉坎,死亡現(xiàn)場離奇詭異澳眷,居然都是意外死亡,警方通過查閱死者的電腦和手機蛉艾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門钳踊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勿侯,你說我怎么就攤上這事拓瞪。” “怎么了助琐?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵祭埂,是天一觀的道長。 經(jīng)常有香客問我兵钮,道長蛆橡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任掘譬,我火速辦了婚禮泰演,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘葱轩。我一直安慰自己睦焕,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布酿箭。 她就那樣靜靜地躺著复亏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缭嫡。 梳的紋絲不亂的頭發(fā)上缔御,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音妇蛀,去河邊找鬼耕突。 笑死,一個胖子當著我的面吹牛评架,可吹牛的內(nèi)容都是我干的眷茁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼纵诞,長吁一口氣:“原來是場噩夢啊……” “哼上祈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤登刺,失蹤者是張志新(化名)和其女友劉穎籽腕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纸俭,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡皇耗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揍很。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郎楼。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窒悔,靈堂內(nèi)的尸體忽然破棺而出呜袁,到底是詐尸還是另有隱情,我是刑警寧澤简珠,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布傅寡,位于F島的核電站,受9級特大地震影響北救,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芜抒,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一珍策、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宅倒,春花似錦攘宙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至线召,卻和暖如春铺韧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缓淹。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工哈打, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讯壶。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眷细。 傳聞我的和親對象是個殘疾皇子膛虫,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

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