DOM的基礎知識筆記(2)--增刪改查

開局兩張圖,熟悉一下節點的概念。
在這裏插入圖片描述
在這裏插入圖片描述

DOM查詢

在DOM基礎筆記(1)中已經介紹了DOM的查詢的三個方法:
1.getElementById() 通過id屬性獲取一個元素節點對象
2.getElementsByTagName() 通過標籤名獲取一組元素節點對象
3.getElementsByName() 通過name屬性獲取一組元素節點對象
但以上的方法只能獲取當響應處的節點,如果是個多層關係的結構,想要深入的獲取其子節點或者父節點對象該如何操作?
所以DOM裏面也有元素節點的子節點和父節點的方法。

獲取元素節點子節點

獲取元素節點子節點的方法(可以通過具體的元素節點調用):
1.getElementsByTagName() 返回當前節點的指定標籤名後代節點
2.childNodes 表示當前節點的所有子節點。注意標籤之間的空白也會被當成文本節點。而children屬性可獲取當前元素的所有子元素節點,這就很好的避免了標籤之間的空白也會被當成文本節點的問題
3.firstchild 返回當前節點的第一個子節點 標籤之間的空白也會被當成文本節點
firstElementChild獲取當前對象第一個子元素,但是不支持ie8以下的瀏覽器
4. lastchild 返回當前節點的最後一個子節點 標籤之間的空白也會被當成文本節點
lastElementChild獲取當前對象最後一個子元素,也不支持ie8以下的瀏覽器

    <script>
        // 獲取元素節點的子節點
        // 可以通過具體的元素節點調用
        window.onload = function(){
            // 1.getElementsByTagName() 返回當前節點的指定標籤名後代節點
            var sport = document.getElementById("sport");
            var li = sport.getElementsByTagName("li");
            // 不可通過id來獲取子節點
            console.log(li[0]);//結果<li>籃球</li>
            console.log(li[0].innerText);//結果爲籃球

            //2.childNodes 表示當前節點的所有子節點
            var son = sport.childNodes;
            console.log(son);
            //結果:[text, li, text, li, text, li, text, li, text, h1, text]
            // 但是html代碼裏面只有5個子節點
            // 當我們這樣寫html時<ul id="sport"><li>籃球</li><li>足球</li><li>羽毛球</li><li>網球</li><h1>游泳</h1></ul>
            // 會發現結果是5個子節點數目正確
            // 所有這說明了標籤之間的空白也會被當成文本節點
            
            // children屬性可獲取當前元素的所有子元素節點
            var son2 = sport.children;
            console.log(son2);//結果五個元素節點,數目正確
            // firstchild 返回當前節點的第一個子節點 標籤之間的空白也會被當成文本節點
            // lastchild 返回當前節點的最後一個子節點 標籤之間的空白也會被當成文本節點
            var son3 = sport.firstChild;
            console.log(son3);//結果爲空白
            //firstElementChild獲取當前對象第一個子元素,但是不支持ie8以下的瀏覽器
            //lastElementChild獲取當前對象最後一個子元素,也不支持ie8以下的瀏覽器
            var son4 = sport.firstElementChild;
            console.log(son4);//結果爲<li>籃球</li>
        }
    </script>
<body>
    <ul id="sport">
        <li>籃球</li>
        <li>足球</li>
        <li>羽毛球</li>
        <li>網球</li>
        <h1>游泳</h1>
    </ul>
</body>

獲取父節點和兄弟節點

  1. parentNode表示當前節點的父節點
  2. previousSibling表示當前節點的前一個兄弟節點(標籤之間的空白也會被當成文本節點)
    previousElementSibling; 獲取當前對象的前一個元素節點,不支持ie8以下的瀏覽器
  3. nextSibling表示當前節點的後一個兄弟節點(標籤之間的空白也會被當成文本節點)
    nextElementSibling; 獲取當前對象的後一個元素節點,不支持ie8以下的瀏覽器
    <script>
       
        window.onload = function(){
            // parentNode表示當前節點的父節點
            var football = document.getElementById("football");
            console.log(football.parentNode);//結果返回<ul id="sport">...</ul>
            // previousSibling表示當前節點的前一個兄弟節點(標籤之間的空白也會被當成文本節點)
            var pre = football.previousSibling;
            console.log(pre);//結果返回爲#text空白
            var pre = football.previousElementSibling;//獲取當前對象的前一個元素節點,不支持ie8以下的瀏覽器
            console.log(pre);//結果返回<li>籃球</li> 
        }
    </script>
</head>
<body>
    <p id="id">Hello</p>
    <ul id="sport">
        <li>籃球</li>
        <li id="football">足球</li>
        <li>羽毛球</li>
        <li>網球</li>
        <h1>游泳</h1>
    </ul>
</body>

通過css選擇器查詢

1.getElementsByClassName():根據class屬性元素來查找節點對象,但兼容性較差,不支持ie8。
2.querySelector()
3.querySelectorAll()
.querySelector()和.querySelectorAll()的作用是可以根據一個css選擇器來查詢一個元素節點對象 而且兼容性不算太差,ie8及以上可以使用。完美的解決了通過class屬性來得到元素對象的問題,同時也解決了上一個兼容性差的問題。
不同點:
.querySelector()只能返回唯一一個元素,如果滿足條件的有多個元素,他也只會返回第一個元素。
.querySelectorAll()彌補了.querySelector()只能返回唯一一個元素的缺點,會將符合條件的元素封裝到一個數組中返回

<script>
        window.onload = function(){
            // 根據class屬性元素來查找節點對象,但兼容性較差,不支持ie8
            var box1 = document.getElementsByClassName("box1");
            console.log(box1[0]);
            //querySelector()  querySelectorAll()
            var box2 = document.querySelector(".box1 .box2");//()內,使用css選擇器語句
            console.log(box2.innerText);//結果返回這是box2
            var box1 = document.querySelectorAll(".box1");
            console.log(box1[1].innerHTML);//結果返回這是box
        }
</script>

<body>
    <div class="box1">
        <h1>這是box1</h1>
        <div class="box2">
            <h1>這是box2</h1>
        </div>
    </div>
    <div class="box1">
        <h1>這是box</h1>
    </div>
</body>

DOM增加

1.document.createElement() 用於創建一個元素節點對象,它需要一個標籤名作參數,創建元素節點對象
2.document.createTextNode() 用於創建一個文本節點對象,需要文本內容作爲參數。
3.appendChild() 用於向父節點中添加一個新的子節點
4.insertBefore(“新的節點”,“舊的節點”); 用於在指定節點前插入新節點

    <script>
        window.onload = function (){
            // DOM增加
            // 用於創建一個li元素節點對象
            var li = document.createElement("li");
            // document.createTextNode()
            // 用於創建一個"python"文本節點對象
            var python = document.createTextNode("python");
            li.appendChild(python);//將python設置爲li子節點
            var language = document.getElementById("language");
            //將li作爲language的子節點
            language.appendChild(li);
            /*此處的結果是
            			java
						C++
						C語言
						python*/
			
            var java = document.getElementById("java");
            // insertBefore("新的節點","舊的節點");
            // 用於在指定節點前插入新節點
            language.insertBefore(li,java);
            /*此處的結果是
            			python
						java
						C++
						C語言*/
        }
    </script>

<body>
    <ul id="language">
        <li id="java">java</li>
        <li>C++</li>
        <li id="C">C語言</li>
    </ul>
</body>

DOM修改

1.innerHTML獲取節點中的html代碼, innerText獲取節點中的文本節點 ,用"="進行賦值修改
2.replaceChild()用於使該節點用指定的子節點替換已有節點

    <script>
        window.onload = function (){
            //DOM改變
            var java = document.getElementById("java");
            // innerHTML獲取節點中的html代碼
            // innerText獲取節點中的文本節點
            // 用"="進行賦值修改
            java.innerHTML="<li>java</li>";
            java.innerText="javascript";
            /*此時的結果爲:
           				 javascript
						 C++
						 C語言*/
            var C = document.getElementById("C");
            // replaceChild()用於使該節點用指定的子節點替換已有節點
            language.replaceChild(java,C);
            /*此時的結果爲: 
						 C++
						 javascript*/
        }
    </script>

<body>
    <ul id="language">
        <li id="java">java</li>
        <li>C++</li>
        <li id="C">C語言</li>
    </ul>
</body>

DOM刪除

removeChild()用於該節點刪除一個子節點

    <script>
        window.onload = function (){
            //DOM刪除
            // removeChild()用於該節點刪除一個子節點
            language.removeChild(java);
            /*此時的結果爲: 
						 C++
						 C語言t*/
        }
    </script>

<body>
    <ul id="language">
        <li id="java">java</li>
        <li>C++</li>
        <li id="C">C語言</li>
    </ul>
</body>

與innerHtml相結合

在上面的增刪改查中,我們發現有些操作過於繁瑣了,例如DOM的增加,我們需要先創建元素節點對象,後創建文本節點對象,之後再通過document這個接口來獲取相應的父元素,再通過appendChild()才能把新的元素節點添加到網頁中。既然innerHtml可以改變父節點中的html代碼,我們可以通過其來改變html代碼來進行添加。當然此文沒有涉及到框架的內容,現在市面上很多框架可以簡化這些操作。
這裏以上面的DOM增加來做例子

language.innerHTML += "<li>php</li>";//在language的節點對象末尾加入<li>php</li> 
//此方法等於重寫language的元素節點對象
/*顯示的結果是
			python
			java
			C++
			C語言
			php*/
//此方法最優,沒有重寫元素節點對象
// 用於創建一個li元素節點對象
 var li = document.createElement("li");
 li.innerHtml="php";
 language.appendChild(li);
 /*顯示的結果是
			python
			java
			C++
			C語言
			php*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章