JavaScript學習筆記(DOM 導航、節點、集合、節點列表)

通過HTMLDOMain能夠使用節點關係來導航節點樹。


DOM節點

W3CHTML DOM標準,HTML文檔中的所有的事物都節點:

  • 整個文檔是文檔節點
  • 每個HTML元素是元素節點
  • HTML元素內的文本是文本節點
  • 每個HTML屬性是屬性節點
  • 所有註釋是註釋節點
    在這裏插入圖片描述
    有了HTML DOM,節點樹中的所有節點才能通過JavaScript來訪問。
    能夠創建新節點,還可以修改和刪除所有節點。

節點關係:

節點樹中的節點彼此之間有一定的等級關係。

  • 術語(父、子和同胞,parent、child以及sibling)用於描述這些關係。
  • 在節點樹中,頂端節點被稱爲根(根節點)。
  • 每個節點都有父節點,除了根(根節點沒有父節點)。
  • 節點能夠擁有一定數量的子
  • 同胞(兄弟或者姐妹)指的是擁有相同節點父的節點。
<html>
	<head>
		<title>DOM </title>
	</head>
	<body>
		<h1> 第一課</h1>
		<p> Hello World!</p>
	</body>
</html>

在這裏插入圖片描述
從以上的HTML中能夠讀到以下信息:

  • html是根節點
  • html沒有父
  • html是head和body的父
  • head是html的第一個子
  • body是html的最後一個子
    同時:
  • head有一個子:title
  • title有一個子(文本節點):“DOM”
  • body有兩個子:h1 和 p
  • h1有一個子:第一課
  • p有一個子:Hello World!
  • h1 和 p是同胞

在節點之間導航

通過JavaScript,可以使用以下節點屬性在節點之間導航:

  • parentNode
  • childNodes[nodenumber]
  • firstChild
  • lastChild
  • nextSibling
  • previousSibling

子節點和節點值

DOM處理中的一種常見錯誤是認爲元素節點中包含文本。
實例:

<title id = "demo"> DOM 教程</title>

它包含了值爲"DOM 教程"的文本節點。

文本節點的值能夠通過節點的innerHTML 屬性進行訪問:

var myTitle = document.getElementById("demo").innerHTML;

訪問innerHTML 屬性等同於訪問首個子節點的nodeValue:

var myTitle = document.getElementById("demo").firstChild.nodeValue;

訪問第一個子節點:

var myTitle = document.getElement("demo").childNodes[0].nodeValue;

1. 取出h1元素中的文本並複製到P元素中:(第一種)

<body>

    <h1 id="id01">我的第一張網頁</h1>
    <p id="id02">Hello!</p>

    <script>
      document.getElementById("id02").innerHTML = 
      document.getElementById("id01").innerHTML;
    </script>
</body>

在這裏插入圖片描述

2. 取出h1元素中的文本並複製到P元素中:(第二種)

<body>

    <h1 id="id01">我的第一張網頁</h1>
    <p id="id02">Hello!</p>

    <script>
      document.getElementById("id02").innerHTML = 
      document.getElementById("id01").firstChild.nodeValue;
    </script>
</body>

3. 取出h1元素中的文本並複製到P元素中:(第三種)

<body>

    <h1 id="id01">我的第一張網頁</h1>
    <p id="id02">Hello!</p>

    <script>
      document.getElementById("id02").innerHTML = 
      document.getElementById("id01").childNodes[0].nodeValue;
    </script>
</body>

InnerHTML
使用innerHTML取回HTML元素的內容。


DOM 根節點
有兩個特殊屬性允許訪問完整文檔:

  • document.body - 文檔的body
  • document.documentElement - 完整文檔
    實例:
	<p>Hello World!</p>

    <div>
        <p>DOM 很有用</p>

        <p>本例演示:<b>doucument.body</b>屬性。</p>
    </div>

    <script>
      alert(document.body.innerHTML);
    </script>

在這裏插入圖片描述
第二種:
在這裏插入圖片描述

	<p>Hello World!</p>

    <div>
        <p>DOM 很有用</p>

        <p>本例演示:<b>doucument.documentElement</b>屬性。</p>
    </div>
    <script>
      alert(document.documentElement.innerHTML);
    </script>

nodeName屬性
nodeName屬性規定節點的名稱。

  • nodeName 是隻讀的
  • 元素節點的nodeName 等同於標籤名
  • 屬性節點的nodeName 是屬性名稱
  • 文本節點的nodeName 總是 #text
  • 方根節點的nodeName 總是 #document

案例:

<h1 id="id01">我的第一張網頁</h1>

    <p id="id02"></p>

    <script>
      //獲取id爲id01的標籤名
      document.getElementById("id02").innerHTML = 
      document.getElementById("id01").nodeName;//H1
    </script>

注意:nodeName總是包含HTML元素的大寫標籤名。


nodeType屬性
nodeType屬性返回節點的類型,nodeType是隻讀的。

<h1 id="id01">我的第一張網頁</h1>

    <p id="id02"></p>

    <script>
      //獲取id爲id01的標籤名

      document.getElementById("id02").innerHTML = 
      document.getElementById("id01").nodeType;//1
    </script>

nodeType的屬性:
在這裏插入圖片描述


JavaScript HTML DOM 元素(節點)

添加和刪除節點(HTML元素)

如需向HTML DOM添加新元素,必須首先創建這個元素(元素節點),然後將其追加到已有的元素。


例子:

<div id="div1">
        <p id="p1">這是一段文字。</p>
        <p id="p2">這是另一段文字。</p>
    </div>  

    <script>
        //創建了一個新的<p>元素
        var para = document.createElement("p");
        //如果要向<p>元素添加文本,就需要先創建文本節點,
        var node = document.createTextNode("這是個新文本!");
        //然後向<p>元素添加這個文本節點
        para.appendChild(node);

        //查找一個已有的元素
        var element = document.getElementById("div1");
        //向這個已有的元素追加新元素
        element.appendChild(para);
    </script>

創建新的HTML元素-insertBefore()

<div id="div1"> 
        <p id="p1"></p>這是一段文字!</p>
        <p id="p2">這是另一段文字。</p>
    </div>

    <script>
        var para = document.createElement("p");
        var node = document.createTextNode("這是最新的文本哦!");
        para.appendChild(node);

        var element = document.getElementById("div1");
        var child = document.getElementById("p1");
        element.insertBefore(para,child);
    </script>

在這裏插入圖片描述


刪除已有HTML元素(removeChild)

如需刪除某個HTML元素,需要知道該元素的父:
第一種:

<div id="div1">
        <p id="p1">這是第一段文字</p>
        <p id="p2">這是第二段文字</p>
    </div>

    <script>
        var parent = document.getElementById("div1");
        var child = document.getElementById("p1");
        parent.removeChild(child);
    </script>

在這裏插入圖片描述
第二種方式:

	<div id="div1">
        <p id="p1">這是第一段文字</p>
        <p id="p2">這是第二段文字</p>
    </div>

    <script>
        //拿到child
        var child = document.getElementById("p2");
        //通過child找到它的parent並且刪除child
        child.parentNode.removeChild(child);
    </script>

方法 node.remove() 是在 DOM 4 規範中實現的。


替換HTML元素(replaceChild)

如需替換元素的,請使用 replaceChild() 方法:

<div id="div1">
        <p id="p1">這是一段文字。</p>
        <p id="p2">這是另一段文字。</p>
    </div>
    <script>
        var parent = document.getElementById("div1");
        var child = document.getElementById("p1");

        var para = document.createElement("p");
        var node = document.createTextNode("這是新的文本。小可愛!");
        //用新的文本替換了id爲p1的文本
        parent.replaceChild(para,child);
    </script>

在這裏插入圖片描述


JavaScript HTML DOM 集合


HTMLCollectioin 對象

getElementsByTagName() 方法返回HTMLCollection對象。
HTMLCollection對象是類數組的HTML元素列表(集合)。
例如 :選中文檔中的所有p元素:

var x = document.getElementsByTagName("p");

該集合中的元素可通過索引 號進行訪問。
如果需要訪問第二個p 元素,可以寫:

y = x[1];

	<h1>JavaScript HTML DOM</h1>

    <p>Hello World!</p>

    <p>Hello Chinal!</p>

    <p id="demo"></p>
    <script>
        //將所有的p標籤都放到myCollection集合
        var myCollection = document.getElementsByTagName("p");
        document.getElementById("demo").innerHTML = 
        "第二段的 innerHTML 是:"+
        myCollection[1].innerHTML;
    </script>

在這裏插入圖片描述


HTML HTMLCollection長度

lenght 屬性定義了HTMLCollection中元素的數量:

<h1>JavaScript HTML DOM</h1>

    <p>Hello World!</p>

    <p>Hello Chinal!</p>

    <p id="demo"></p>

    <p id="last"></p>
    <script>
        var myCollection = document.getElementsByTagName("p");
        document.getElementById("last").innerHTML = 
        "此文檔包含 "+ myCollection.length + "段文字。";
    </script>

在這裏插入圖片描述

實例:改變所有p元素的背景色:

<h1>JavaScript HTML DOM</h1>

    <p>Hello World!</p>

    <p>單擊按鈕可更改所有P元素的顏色</p>

    <button onclick="myFunction()">試一試</button>

    <script>
        function myFunction() {
            var myCollection = document.getElementsByTagName("p");
            var i;
            for(i = 0; i< myCollection.length; i++){
                myCollection[i].style.color = "red";
            }
        }
    </script>

在這裏插入圖片描述

HTMLCollection並非數組!

HTMLCollection 也許看起來像數組,但並非數組。
能夠遍歷列表並通過數字引用元素(就像數組那樣)。
不過,我們無法像作用數組那樣,valueOf()、pop()、push()或者join()。


JavaScript HTML DOM 節點列表


HTML DOM NodeList對象
NOdeList對象與HTMLCollection對象幾乎相同。
NodeList對象與HTMLCollection 對象幾乎是相同的。
如果使用getElementsByClassName()方法,某些瀏覽器會返回NodeList對象而不是HTMcollection.
但是所有的瀏覽器都會爲childNode屬性返回NodeList對象。
大多數瀏覽器會爲querySelectorAll() 方法返回 NodeList對象。
例子: 選中文檔中的所有p節點:

	<h1>JavaScript HTML DOM</h1>

    <p>Hello World!</p>

    <p>Hello China!</p>

    <button onclick="myFunction()">點擊一下!</button>
    <p id="demo"></p>
    <p id="demo2"></p>
    <script>
        function myFunction() {
            var myNodeList = document.querySelectorAll("p");
        document.getElementById("demo").innerHTML = 
        "第一段的 innerHTML 是:"+
        myNodeList[0].innerHTML;

            var myNodeList2 = document.querySelectorAll("p");
        document.getElementById("demo2").innerHTML = 
        "第二段的 innerHTML 是:"+
        myNodeList2[1].innerHTML;
        }
    </script>

在這裏插入圖片描述


HTML DOM NOdeList長度:

length屬性定義節點列表中的節點數:

	<h1>JavaScript HTML DOM</h1>

    <p>Hello World!</p>

    <p>Hello China!</p>

    <p>Hello China!</p>
    
    <p>Hello China!</p>

    <p id="demo"></p>

    <script>
        var myNodeList = document.querySelectorAll("p");
        document.getElementById("demo").innerHTML = 
        "此文檔包含"+myNodeList.length  + " 段文字!";
    </script>

在這裏插入圖片描述

改變節點列表中所有p元素的背景色:

<h1>JavaScript HTML DOM</h1>

    <p>Hello World!</p>

    <p>Hello China!</p>

    <p>Hello China!</p>

    <p>Hello China!</p>

    <button onclick="myFunction()">試一試</button>

    <script>
        function myFunction() {
            var myNodeList = document.querySelectorAll("p");
            var i;
            for(i = 0; i< myNodeList.length; i++){
                myNodeList[i].style.color = "pink";
            }
        }
    </script>

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章