JS DOM操作(創建、遍歷、獲取、操作、刪除節點)

来源:https://www.cnblogs.com/chenyingying0/archive/2020/01/01/12128736.html
-Advertisement-
Play Games

創建節點 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" con ...


創建節點

 <!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>create方法</title>
    <script src="domReady.js"></script>
    <script>
      myReady(function(){
        // 創建註釋節點
        var comment = document.createComment("A comment");
        // 創建文檔片段
        var fragment = document.createDocumentFragment();

        var ul = document.getElementById("myList");
        var li = null;
        for (var i = 0; i < 3; i++){
          // 創建元素節點
          li = document.createElement("li");
          // 添加創建好的文本節點
          li.appendChild(document.createTextNode("Item " + (i+1)));
          fragment.appendChild(li);
        }
        ul.appendChild(fragment);
        // 插入註釋節點
        document.body.insertBefore(comment, document.body.firstChild);
      });
    </script>
  </head>
  <body>
    <ul id="myList"></ul>
  </body>
</html>

html5shiv

      (function() {
        if (! 
        /*@cc_on!@*/
        0) return;
        var e = "abbr, article, aside, audio, canvas, datalist, details, dialog, eventsource, figure, footer, header, hgroup, mark, menu, meter, nav, output, progress, section, time, video".split(', ');
        var i = e.length;
        while (i--){
          document.createElement(e[i]);
        }
      })();

創建節點createElement:

它的的參數可以是大小也可以是小寫,但是多數情況下我們使用小寫

document.createElement()創建的HTML5標簽是可以相容IE8以下的瀏覽器的

 


 

 

高效創建節點innerHTML-outerHTML

      // innerHTML的限制:
      // 字元串最左邊不能出現空白,否則會被移除
      // 多數瀏覽器不會對script腳本進行執行
      // 不能單獨創建meta/style/link等
      myReady(function(){
        var content = document.getElementById("content");
        var str = "<p>This is a <strong>paragraph</strong> with a list following it.</p>"
                    + "<ul>"
                    + "<li>Item 1</li>"
                    + "<li>Item 2</li>"
                    + "<li>Item 3</li>"
                    + "</ul>";
        content.innerHTML = str;
        alert(content.innerHTML);
      });

多數瀏覽器不會對script腳本進行執行

解決:添加defer屬性

放在有作用域的元素之後

        var content = document.getElementById("content");
        var str = "<input type=\"hidden\"><script defer>alert('hi');<\/script>";
        content.innerHTML = str;
      });

創建style時解決IE相容

        var content = document.getElementById("content");
        var str = "_<style type=\"text/css\">body {background-color: red; }</style>";
        content.innerHTML = str;
        // 移除最開頭添加的_
        content.removeChild(content.firstChild);
      });

innerText

        // innerText相容火狐寫法:textContent
        var content = document.getElementById("content");
        function getInnerText(element){
          return typeof (element.textContent == "string") ? element.textContent : element.innerText;
        }
        function setInnerText(element, text){
          if (typeof element.textContent == "string"){
            element.textContent = text;
          } else {
            element.innerText = text;
          }
        }
        setInnerText(content, "Hello world!");
        console.log(getInnerText(content));

節點遍歷(查找節點)

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>dom Tree walker</title>
    <script src="domReady.js"></script>
    <script>
      myReady(function(){
        // documentElement返迴文檔根節點
        var oHtml = document.documentElement;
        var p = document.getElementById("paragraph");
        var txt = p.childNodes[0];

        // 獲取head節點三種方法
        var oHead = oHtml.firstChild;
        var oHead = oHtml.childNodes[0];
        var oHead = oHtml.childNodes.item(0);

        // 獲取body節點的兩種方法
        var oBody = oHtml.childNodes.item(1);
        var oBody = oHtml.childNodes[1];

        console.log(oHead.parentNode == oHtml);
        console.log(oBody.parentNode == oHtml);

        // 上一個兄弟元素
        console.log(oBody.previousSibling == oHead);
        // 下一個兄弟元素
        console.log(oHead.nextSibling == oBody);

        console.log(oBody);
        console.log(oHead);
        console.log(oHtml.tagName);//HTML

        // 通過p節點找到document節點
        console.log(p.ownerDocument == document);
        // 是否有子節點
        console.log(p.hasChildNodes());
        console.log(txt.hasChildNodes());
      });
    </script>
  </head><body>
    <p id="paragraph">文本葉子節點</p>
  </body>
</html>

 

 

輸出分別是:false/true/false

1、 首先區分firstChild和childNodes的區別

firstChild表示第一個子節點, 這個子節點包括元素節點,文本節點或者註釋節點

childNodes 返回節點的子節點集合,包括元素節點、文本節點還有屬性節點。 

2、分析這題的代碼

 第一個ul的第一個子節點是一個空的文本節點,也就是ul和li的換行,他是沒有子節點的,所以為false

 第一個ul的第二個子節點是第一個li,有子節點,所以為true

 第二個ul的第一個li,沒有子節點,所以為false

 


 

 

列印HTML結構樹:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>DOM Travel</title>
    <script src="domReady.js"></script>
    <script>
      myReady(function(){
        var s = "";
        // space存儲節點間分隔的字元串
        // node保存遍歷的當前節點
        function travel(space, node) {
          if (node.tagName) { // 如果當前節點是標簽,不是空的,就拼接字元串
            s += space + node.tagName + "<br/>";
          }
          var len = node.childNodes.length; //保存當前節點的子節點的個數
          for (var i = 0; i < len; i++) { //遍歷節點的子節點
            // 遞歸調用travel()
            travel(space + "|-", node.childNodes[i]); 
          }
        }
        travel("", document);
        document.write(s);
      });
    </script>
  </head>
  <body>
    <form>  
        <input type="button" id="button1" name="button1" value="Click Me!" />  
    </form>
  </body>
</html>

 

 

解決空白節點問題方法一:

1 元素節點

2 屬性節點

3 文本節點

        var box = document.getElementById("box");
        for(var i = 0, len = box.childNodes.length; i < len; i++) {
          if (box.childNodes[i].nodeType == 1) {
            // 只輸出元素節點(過濾文本節點)
            console.log(box.childNodes[i]);
          }
        }

解決空白節點問題方法二:

firstElementChild第一個元素節點

lastElementChild

nextElementSibling下一個兄弟元素節點

previoustElementSibling

childElementCount 所有直接子元素節點的個數

        var box = document.getElementById("box");
        for(var i = 0, len = box.childElementCount; i < len; i++) {
          console.log(box.children[i]);
        }

類數組對象nodeList

類數組對象無法使用數組方法

將類數組對象轉為數組

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>NodeList對象的特點</title>
    <script src="domReady.js"></script>
    <script>
      myReady(function(){
        var box = document.getElementById("box");
        var nodes = box.childNodes;

        // 類數組對象無法使用數組方法
        console.log(nodes);
        console.log(nodes[1]);
        nodes.push("<li>節點四</li>");

        // 將類數組對象轉為數組相容IE的寫法
        function makeArray(nodeList){
          var arr = null;
          try {
            // 將類數組對象轉為數組
            return Array.prototype.slice.call(nodeList);
          }catch (e){
            arr = new Array();
            for(var i = 0, len = nodeList.length; i < len; i++){
              arr.push(nodeList[i]);
            }
          }
          return arr;
        }

        var newNodeList = makeArray(nodes);
        newNodeList.push("<li>節點四</li>");
        console.log(newNodeList);
      });
    </script>
  </head>
  <body>
    <ul id="box">  
      <li>節點一</li>
      <li>節點二</li>
      <li>節點三</li>  
    </ul>
  </body>
</html>

類數組對象HTMLCollection

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>類數組對象HTMLCollection</title>
    <script src="domReady.js"></script>
    <script>
      myReady(function(){
        var scripts = document.scripts;
        var links = document.links;
        // 表格元素
        var cells = document.getElementById("tr").cells;
        // var imgs = document.images;
        var forms = document.forms;
        var options = document.getElementById("select").options;
        var ps = document.getElementsByTagName("p");

        console.log(scripts);
        console.log(links);
        console.log(cells);
        // console.log(imgs);
        console.log(forms);
        console.log(options);
        console.log(ps);

        //HTMLCollection對象的namedItem()方法
        //返回集合中具有指定name屬性或id屬性的元素
        console.log(cells.namedItem('td'));
      });
    </script>
  </head>
  <body>
    <ul id="box">
      <li>節點一</li>
      <li>節點二</li>
      <li>節點三</li>
    </ul>

    <table border="1">
      <tr id="tr">
        <td id="td">第一行</td>
        <td name="td">第二行</td>
        <td name="td">第三行</td>
      </tr>
    </table>

   <!--  <img src="duer.jpg" alt="img1" />
    <img src="ipone6s+.png" alt="img2" /> -->

    <form action="">
      <input type="text" value="用戶名">
    </form>
    <form action="">
      <input type="text" value="密碼">
    </form>

    <a href="#">忘記密碼</a>
    <a href="#">更多內容</a>

    <select id="select">
      <option value="0">北京</option>
      <option value="1">天津</option>
      <option value="2">河北</option>
    </select>

    <p>DOM探索之基礎詳解篇</p>
    <p>DOM探索之節點操作篇</p>
  </body>
</html>

類數組對象NamedNodeMap

返回attr屬性相關信息

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>類數組對象NamedNodeMap</title>
    <script src="domReady.js"></script>
    <script>
      myReady(function(){
        var box = document.getElementById("box");
        var attrs = box.attributes;
        console.log(attrs);
        console.log(attrs.length);
        console.log(attrs[0]);
        console.log(attrs.item(1));
      });
    </script>
  </head>
  <body>
    <ul id="box" data-url="index.html" node-action="submit">
      <li>節點一</li>
      <li>節點二</li>
      <li>節點三</li>
    </ul>
  </body>
</html>

類數組對象具有動態性

        var divs = document.getElementsByTagName("div");
        // 先把最初的長度記錄在變數里,防止後期動態改變
        var length = divs.length;
        var i = 0;
        while(i < length){
          document.body.appendChild(document.createElement("div"));
          i++;
        }

獲取節點

getElementsByName()方法必須在document後使用

// 獲取所有的元素
var all = document.getElementsByTagName('*');

getElementsByClassName()相容性問題解決:

封裝函數:

// 函數用於選取符合標簽名的元素
var getElementsByClassName = function(opts) {
    var searchClass = opts.searchClass; // 存儲要查找的類名
    var node = opts.node || document;  // 存儲要出查找的範圍
    var tag = opts.tag || '*'; // 存儲一定範圍內要查找的標簽
    var result = [];
        // 判斷瀏覽器支不支持getElementsByClassName方法
    if (document.getElementsByClassName) { // 如果瀏覽器支持
        var nodes = node.getElementsByClassName(searchClass);
        if (tag !== "*") {
            for (var i = 0; node = nodes[i++];) {
                if (node.tagName === tag.toUpperCase()) {
                    result.push(node);
                }
            }
        } else { 
            result = nodes;
        }
        return result;
    } else { // 使用IE8以下的瀏覽器能夠支持該屬性
        var els = node.getElementsByTagName(tag);
        var elsLen = els.length;
        var i, j;
        var pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)");
        for (i = 0, j = 0; i < elsLen; i++) {
            if (pattern.test(els[i].className)) { // 檢測正則表達式
                result[j] = els[i];
                j++;
            }
        }
        return result;
    }
}

頁面調用:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>getElementsByClassName() 相容瀏覽器方案</title>
    <script src="domReady.js"></script>
    <script src="getElementsByClassName.js"></script>
    <script>
      myReady(function(){
        var myUl2 = document.getElementById("myUl2");
        var r = getElementsByClassName({
          searchClass: "light dark",
          node: myUl2
        });
        console.log(r[0].innerHTML);
      });
    </script>
  </head>
  <body>
    <ul id="myUl">
      <li class="light">1</li>
      <li class="light dark">2</li>
      <li class="light">3</li>
    </ul>
    <ul id="myUl2">
      <li class="light">1</li>
      <li class="light dark">second</li>
      <li class="light">3</li>
    </ul>
  </body>
</html>

querySelector()和querySelectorAll()方法

querySelectorAll()和querySelector()方法返回的是一個靜態的NodeList,所謂靜態NodeList就是對底層document的更改不會影響到返回的這個NodeList對象.此時返回的NodeList只是querySelectorAll()方法被調用時的文檔狀態的快照

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>querySelector()</title>
    <script src="domReady.js"></script>
    <script>
      myReady(function(){
        var myDiv = document.getElementById('myDiv');
        // querySelector(id)
        var ul = myDiv.querySelector('#myUl');
        var ul = document.querySelector('#myUl');
        // querySelector(css選擇器)
        var li = myDiv.querySelector('li:last-child');
        // querySelector(tag)
        var els = document.querySelector('input, li');
        var span = document.querySelector('span');
        // querySelector(class)
        // class名中有特殊符號需要轉義
        var input = document.querySelector('.foo\\:bar');
        console.log(ul);
        console.log(li);
        console.log(els);
        console.log(span);
        console.log(input);
      });
    </script>
  </head>
  <body>
    <input type="text" class="foo:bar" value="請輸入內容" />
    <div id="myDiv">
      You are my sunshine.
      <ul id="myUl">
        <li>1</li>
        <li>2</li>
        <li>3</li>
      </ul>
    </div>
  </body>
</html>

JS DOM操作-操作節點

document.createTextNode() 創建文本節點

document.createElement() 創建元素節點

document.firstElementChild 第一個子元素節點

appendChild() 在最後追加子節點

.children.item(n) 第n個子元素

insertBefore(pos,null) 在最後追加子節點

li. insertBefore(pos,ul.firstElementChild) 在最前面插入子節點

li. insertBefore(pos,ul.lastElementChild) 在最後追加子節點

replaceChild(新節點,要替換掉的節點)

cloneNode() 克隆節點

cloneNode(true) 克隆節點(包括子節點)

document.body.appendChild(newNode) 克隆之後將新節點添加到文檔中

normalize() 合併某個元素的文本節點

.nodeValue() 獲取節點的值(文本值)

splitText(n) 從n位置進行拆分(拆分元素的文本節點)

 


 

JS DOM操作-刪除節點

 

removeNode() IE方法,刪除指定元素

removeNode(true) IE方法,刪除指定元素及子元素


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 菜單快捷導航: 1、創建一個vue項目步驟 (windows環境下)。創建vue項目前,檢查系統是否具備創建項目的條件(是否已經安裝好了node.js、webpack、vue-cli)。cmd打開終端。 1.1 如果還沒安裝node.js, 則先安裝node.js ,安裝完成後,查看node版本 1 ...
  • 按照國際慣例先放效果圖 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>demo</title> <link rel="stylesheet" href="css/style.css"> ...
  • //1、JS獲取兩個日期之間相差的天數 2 function getDaysBetween(dateString1, dateString2) { 3 var startDate = Date.parse(dateString1); 4 var endDate = Date.parse(dateSt ...
  • 原文鏈接:https://mail.qq.com/cgi-bin/readtemplate?t=safety&check=false&gourl=https%3A%2F%2Fwww.freecodecamp.org%2Fnews%2Fweb-development-2020%2F&subtempla ...
  • 安裝node.js 官網:https://nodejs.org/en/ 淘寶NPM鏡像(npm是外網,用國內代理下載安裝賊快) $ npm install -g cnpm --registry=https://registry.npm.taobao.org 全局安裝 vue-cli $ cnpm i ...
  • 複習 面向過程和麵向對象都是編程的思想, 方式不一樣 面向過程: 凡事都是親力親為, 所有的代碼都要自己寫, 每一步都要很清楚, 註重的是過程 面向對象: 執行者成為指揮者, 只要找對象, 然後讓對象做相關的事情, 註重的是結果 面向對象的特性: 封裝, 繼承, 多態 封裝;就是代碼的封裝, 把一些 ...
  • 昨天在公司寫代碼遇到了一個問題,就是在用easyUI做主從表的時候在查詢之後點擊展開的時候不能再次展開了。先說一下主從表我也是第一次用 效果如下圖: 然後點擊前面的小加號出現以下效果: 然而遇到了一個問題,那就是再查詢之後居然不能點開了。於是乎我開始從網上查找問題原因,得到瞭如下答案: 然而改成這樣 ...
  • DOM屬性 console.log(ele.attributes) 獲取ele元素的屬性集合 ele.attributes.getNamesItem(attr).nodeValue 獲取指定屬性值 ele.attributes[attr].nodeValue 獲取指定屬性值 ele.attribut ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...