1. 程式人生 > >JavaScript基礎複習(二) DOM詳解

JavaScript基礎複習(二) DOM詳解

    學過JavaScript的同學應該知道,JS由三部分組成,ECMAScript,DOM,BOM。這節我們詳細瞭解一下DOM(Document Object Model 文件物件模型)。

    很久不直接操作DOM了,現在要寫還是需要回憶許久的。首先查閱了之前的筆記,列出如下導圖,文章也將按照導圖的點來進行詳解。

一、基礎DOM

1、DOM概述

Document Object Model ,就是 文件物件模型

大家應該已經對HTML標籤瞭解了,其實DOM和標籤之間的關係密不可分,html標籤通過瀏覽器解析成DOM節點。html標籤包裹的內容展示在頁面上,行為操作是需要DOM來完成的。一個頁面有很多的html標籤,那麼就對應有很多DOM節點。這麼多的DOM節點根據父子級的關係構成DOM樹。

2、節點型別

在這裡我們就只關注最常用的三種:元素、屬性、文字。

  • 元素節點(Element): html的標籤 <p></p>
  • 屬性節點(Attribute):元素屬性 比如設定的id
  • 文字節點(Text): 頁面上需要展示的內容

這些節點的屬性也都是通用的。有

  • nodeType(返回節點的屬性值),
  • nodeName(返回節點的名稱),
  • nodeValue(返回或設定當前節點的值)。
<div id='main'><p>這是節點1</p><!-- 註釋 -->hello</div>  <!-- 第一級child節點 -->
<script type="text/javascript">
	var divCon = document.getElementById('main');
	var con1 = document.getElementsByTagName('p');
	//空格和換行符會被解釋成節點
	for (var i = 0; i < divCon.childNodes.length; i++) { 
		console.log('-------------')   
        console.log("nodeType:"+divCon.childNodes[i].nodeType+"");  
        console.log("nodeName:"+divCon.childNodes[i].nodeName+""); 
        console.log("nodeValue:"+divCon.childNodes[i].nodeValue+"");                   
    } 
</script>

結果:

如果只想要返回元素節點的長度可以用: 

ele.childElementCount 方法或者 ele.children.length方法

注意: IE瀏覽器只能使用nodeType 是否等於某個數值 來判斷節點型別

3、屬性

可以進行獲取或設定某個節點的屬性值。

  • innerHTML 節點(元素)的文字值,獲取/設定節點內容
  • parentNode 節點(元素)的父節點
  • childNodes 節點(元素)的子節點
  • attributes 節點(元素)的屬性節點
  • style 修改節點樣式

當然,還有上述的nodeType,nodeName,nodeValue 屬性

屬性操作:(也算是方法)

getAttribute(name)

返回指定的屬性值。

setAttribute(name,value)

把指定屬性設定或修改為指定的值。

removeAttribute(name)

刪除屬性

<div id='main'><p>這是節點1</p><!-- 註釋 -->hello</div>  <!-- 第一級child節點 -->
<script type="text/javascript">
   var divCon = document.getElementById('main');
   var con1 = document.getElementsByTagName('p');
   console.log(divCon.innerHTML)   // <p id="con1">這是節點1</p><!-- 註釋 -->hello
   divCon.innerHTML+=' world'
   console.log(con1[0])  // <p>這是節點1</p>
   console.log(con1[0].parentNode)  // 不能直接使用 con1 需要指定是哪一個元素的父元素。
   console.log(divCon.childNodes) // 陣列  共有三個值,空格和註釋都是節點
   console.log(divCon.attributes)  // id
   console.log(con1.attributes)  //  undefined  沒有屬性
   con1[0].style.color = 'red';   // 通過 . 運算子操作
</script>

4、方法

getElementById()

返回帶有指定 ID 的元素。

object

getElementsByTagName()

返回包含帶有指定標籤名稱的所有元素的節點列表(集合/節點陣列)。

陣列

getElementsByClassName()

返回包含帶有指定類名的所有元素的節點列表。

陣列

appendChild(node)

把新的子節點新增到指定節點。

removeChild(node)

刪除子節點。

replaceChild(node1,node2)

替換子節點。node1替換node2

insertBefore(node1,node2)

在指定的子節點前面插入新的子節點。n1插在n2前

createAttribute(node)

建立屬性節點。

createElement(node)

建立元素節點。

createTextNode(node)

建立文字節點。

        var con2 = document.createElement('h1');
        var con2Attr = document.createAttribute('class');
        con2Attr.value = 'con2'
        con2.setAttributeNode(con2Attr)
        var con2Content = document.createTextNode('這是一級標題');
        con2.appendChild(con2Content);

        con1[0].appendChild(con2);
        console.log(con2);   // <h1 class='con2'>這是一級標題</h1>
        // con1[0].removeChild(con2);  //  去掉剛新增的節點

        var con3 = document.createElement('a');
        var con3Attr = document.createAttribute('href');
        var con3Name = document.createTextNode('Baidu')
        con3Attr.value='http://baidu.com'
        con3.setAttributeNode(con3Attr)
        con3.appendChild(con3Name);
        console.log(con3);
        con1[0].replaceChild(con3,con2);  // con3 替換了con2

        con1[0].insertBefore(con2,con3);   // 在con3前插入con2

ps:實現一個insertAfter方法

        function insertAfter(a1,a2){
        	 var parent = a2.parentNode;
	         if(parent.lastChild == a2) {
	               ​parent.appendChild(a1);
	         }​
	         else {
	              parent.insertBefore(a1, a2.nextSibling);​
	        }​
        }

 拓展:

關注我獲取更多前端資源和經驗分享

                                                                       

關注後回覆    vivi     獲取我的微訊號,望不吝賜教,pps:可輕撩哈哈

感謝大佬們閱讀,希望大家頭髮濃密,睡眠良好,情緒穩定,早日實現財富自由~