JavaScript DOM 基礎

来源:https://www.cnblogs.com/pgjett/archive/2020/03/30/12598762.html
-Advertisement-
Play Games

DOM 即文檔對象模型,是操作 HTML/XML 文檔的一套方法。通過 DOM 操作節點,使頁面發生改變,是動態文檔技術的核心內容 ...


JavaScript DOM 基礎

DOM 即文檔對象模型,是操作 HTML/XML 文檔的一套方法。通過 DOM 操作節點,使頁面發生改變,是動態文檔技術的核心內容

DOM 的含義

  1. DOM 即 document object model,文檔對象模型

  2. JavaScript 中有三類對象

    本地對象 Native Object

    Object Function String Number Boolean
    Error EvalError SyntaxError TypeError RageError ReferenceError URIError
    Date RegExp
    

    內置對象 Built-in Object

    Global: 一類對象的統稱,是虛擬的,代表全局
    任何方法和屬性都在對象之下
    如 isNaN()、parseInt、Number()、decodeURL() 等都是 Global 下的方法
    如 Math、Infinity、NaN、undefined 等都是 Global 下的屬性
    本地對象、內置對象是 ECMAScript 的內部對象
    

    宿主對象 Host Object

    執行 JS 的環境提供的對象,即瀏覽器對象
    window 對象 -> BOM,不同瀏覽器間沒有固定規範
    document 對象 -> DOM,遵從 w3c 規範
    document 是 window 下的對象,即 BOM 包含 DOM
    
  3. DOM 是通過瀏覽器提供的一套方法來操作 HTML 和 XML 文檔

元素和節點

  1. 節點包含元素,元素是節點的一部分,即元素節點

  2. 節點分類

    元素節點、屬性節點、文本節點、註釋節點、文檔節點等

  3. 元素即元素對象,有 HTMLDivElement、HTMLInputElement、HTMLHtmlElement,繼承自構造方法 HTMLElement,HTMLElement 繼承自 Node,Node 即節點對象

  4. document 繼承自構造方法 HTMLDocument 的原型,HTMLDocument 繼承自 Document 的原型

    document.__proto__ -> HTMLDocument.prototype 
    HTMLDocument.prototype.__proto__ -> Document.prototype
    

獲取元素

  1. 通過 id 獲取元素

    document.getElementById(); // 返回對應的 HTMLElement 
    // 對於 getElementById(),IE8 及以下不區分大小寫並且可以匹配 name
    
  2. 通過類名獲取元素集合

    document.getElementsByClassName(); // 返回元素集合 HTMLCollection
    // 相容 IE8 及以上
    
  3. 通過標簽名獲取元素集合

    document.getElementsByTagName(); // 返回元素集合 HTMLCollection
    // 相容 IE8 及以上
    
  4. 通過 name 獲取元素

    document.getElementsByName(); // 返回元素集合 HTMLCollection
    // 常用於表單元素
    
  5. 通過選擇器獲取對象

    // 相容 IE6 及以上,是 HTML5 新加入的 web api,但早就存在了
    document.querySelector(); // 返回選擇器選中的第一個節點對象 Node
    document.querySelectorAll(); // 返回選擇器選中的節點列表 NodeList
    // querySelector、querySelectorAll 性能低
    // 使用 querySelectorAll 返回節點列表,刪除節點後,節點列表不變,不具有實時性
    

遍歷節點樹

  1. parentNode

    獲取父節點

    document.getElementsByTagName("html")[0].parentNode -> document
    // html 標簽元素的 parentNode 是 document
    // 最高級節點是 document,document 的父節點是 null
    
  2. childNodes

    獲取子節點集合

    document.getElementById("box").childNodes 
    // 包括元素節點、文本節點、註釋節點在內
    
  3. firstChild、lastChild

    獲取第一個或最後一個子節點

    document.getElementById("box").firstChild // 第一個子節點
    document.getElementById("box").lastChild // 第二個子節點
    
  4. nextSibling、previousSibling

    獲取上一個或下一個兄弟節點

    document.getElementById("box").nextSibling // 上一個兄弟節點
    document.getElementById("box").previousSibling // 下一個兄弟節點
    
  5. getAttributeNode()

    獲取屬性節點

    document.getElementById("box").getAttributeNode("id") // 獲取屬性節點 id
    

遍歷元素節點

  1. parentElement

    獲取父元素節點,相容 IE9 及以上

    document.getElementsByTagName("html")[0].parentElement -> null
    // html 標簽元素的 parentElement 是 null
    
  2. children

    獲取子元素集合,相容 IE8 及以上

    document.getElementById("box").children // 只包含元素節點
    document.getElementById("box").chilElementCount // children.length
    
  3. firstElementChild、lastElementChild

    獲取第或最後一個子元素節點,相容 IE9 及以上

    document.getElementById("box").firstElementChild // 第一個子元素節點
    document.getElementById("box").lastElementChild // 第二個子元素節點
    
  4. nextElementSibling、previousElementSibling

    獲取下一個或上一個兄弟元素節點,相容 IE9 及以上

    document.getElementById("box").nextElementSibling // 上一個兄弟元素節點
    document.getElementById("box").previousElementSibling // 下一個兄弟元素節點
    

節點的屬性

  1. nodeName

    返回節點名稱、只讀
    元素節點,元素名稱大寫

    document.getElementById("box").nodeName // DIV
    // 文本節點 -> #text
    // 註釋節點 -> #comment
    document.nodeName // #document
    // 文檔節點 -> #document
    
  2. nodeValue

    返回節點內容,可讀寫
    屬性節點、文本節點、註釋節點可用

    document.getElementById("box").getAttributeNode('id').nodeValue // box
    document.getElementById("box").getAttributeNode('id').value // 效果相同
    
  3. nodeType

    返回節點類型對應數字,只讀

    元素節點 1
    屬性節點 2
    文本節點 3
    註釋節點 8
    document 9
    DocumentFragment 11
    

    通過 nodeType 封裝 childNodes,篩選出元素節點

    function childElementArray(node) {
        var arr = [],
            nodes = node.childNodes;
        for (var i = 0; i < nodes.length; i++) {
            var item = nodes[i];
            if (item.nodeType === 1) {
                arr.push(item);
            }
        }
        return arr;
    }
    
  4. attibutes

    返回元素節點的屬性節點組成的類數組

    document.getElementById("box").attributes[0].nodeValue // 獲取第一個屬性節點的 nodeValue
    
  5. hasChildNodes

    返回是否有子節點的布爾值

DOM 結構樹

graph TB A(Node) --> B(Document) A --> C(Element) A --> D(CharacterData) A --> E(Attributes) B --> F(HTMLDocument) D --> G(Text) D --> H(Comment) C --> I(HTMLElement) I --> J(HTMLHtmlElement) I --> K(HTMLHeadElement) I --> L(HTMLDivElement) I --> M(HTML...Element)
  1. DOM 結構樹顯示了構造方法的繼承關係與原型鏈的走向

  2. Document 的原型被 HTMLDocument 繼承,同樣被 XMLDocument 繼承

  3. CharacterData 的原型是文本節點和註釋節點的祖先

  4. HTMLElement 下有與標簽對應的多種 HTML...Element,用於構造元素節點

  5. 需要註意的方法

    getElementById、getElementsByName 只在 Document 的原型上,只有 document 可以使用

    querySelector、querySelectorAll、getElementsByClassName、getElementsByTagName 在 Document 和 Element 的原型上都有,即 document 和元素節點對象都可以使用

    var box = document.getElementById("box");
    box.getElementById("list"); // 報錯
    
  6. 需要註意的屬性

    document.bady 、document.head、document.title 繼承自 HTMLDocoment 的原型

    document.documentElement 繼承自 Document 的原型

    document.bady; // body 標簽元素
    document.head; // head 標簽元素
    document.title; // title 元素內文位元組點
    document.documentElement; // html 標簽元素
    

節點相關操作

  1. document.createElement()

    創建元素節點

    var div = document.createElement("div"); // 傳入標簽名
    
  2. document.createTextNode()

    創建文本節點

  3. document.createComment()

    創建註釋節點

  4. document.createDocumentFragment()

    創建一個文檔碎片,向其中添加節點,再將文檔碎片插入文檔中,可以提高性能

  5. appendChild()

    在節點內部的最後添加子節點,並且具有剪切節點功能

    var div = document.createElement("div"),
        text = document.creaetTextNode("文本");
    div.appendChild(text);
    document.body.appendChild(div);
    
  6. insertBefore(a, b)

    在節點內部 a 節點之前插入 b 節點

    元素節點沒有 insertAfter 方法,可以進行封裝

    Element.prototype.insertAfter = function (target, origin) {
        var after = origin.nextElementSibling;
        if (after) {
            this.insertBefore(target, after);
        } else this.appendChild(target);
    }
    // 相容 IE9 及以上
    
  7. removeChild()

    從文檔中刪除子節點,但記憶體中依然保留空間占用

  8. remove()

    節點調用,刪除自身,可以釋放記憶體

  9. replaceChild(a, b)

    用 a 節點替換子節點 b

  10. innerHTML

    可以取值,可以賦值,並且賦值可以解析 HTML 代碼

  11. innerText

    可以取值,可以賦值,並且將賦值解析成文本節點,標簽符號會被轉碼成字元實體

    firefox 老版本不支持,可使用功能相同的 textContent

  12. setAttribute(),getAttribute()

    設置、獲取屬性

    var div = document.createElement("div");
    div.setAttribute('id', 'box');
    div.getAttribute('id'); // 返回 box
    
  13. dataset

    HTML5 中以命名 data- 開頭的屬性,可以通過 dataset 方法訪問

    // <p data-name="Jett" data-age="22"></p>
    document.getElementsByTagName("p")[0].dateset // {name: 'Jett', age: '22'}
    // 相容 IE9 及以上
    

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

-Advertisement-
Play Games
更多相關文章
  • TypeScript的原始數據類型 String Number boolean null undefined enum symbol // Number var num:number=1; // 整數 num = 2.5; // 小數 num = 0xf00d; // 十六進位 num = 0b01 ...
  • <script>定義了客戶端腳本;<noscript>定義了不支持腳本瀏覽器輸出的文本;html <script> 標簽:<script> 標簽用於定義客戶端腳本,比如 JavaScript;<script> 元素既可包含腳本語句,也可通過 src 屬性指向外部腳本文件;JavaScript 最常用... ...
  • 什麼是HTML 顏色?它採用的是 RGB 顏色,是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色。HTML 顏色由一個十六進位符號來定義,這個符號由紅色、綠色和藍色的值組成(RGB);每種顏色的最小值是0(十六 ...
  • 非同步 1.知道哪部分代碼是非同步的; 2.必須要知道非同步程式之中的數據或者賦值的變數在哪裡可用; js:單線程語言 上面一行代碼不執行結束,下麵一行代碼不會執行; 單線程 多線程 js中存在很大需要長時間等待才會執行的代碼; 非同步 :在js中需要消耗大量時間等待某些程式執行的時候,會讓正常程式繼續執行 ...
  • 瞭解Ajax 就是js這個語言和服務端交互的手段 無刷新的頁面請求處理 區分表單提交 Ajax 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML),是指一種創建互動式、快速動態網頁應用的網頁開發技術,無需重新載入整個網頁的情況下,能夠更新部 ...
  • IT行業作為當今發展前途最大的幾大行業之一,獲得了前所未有的廣泛關註,且隨著科技的發展,這一趨勢將更加明顯。 為了爭奪IT技術人才,很多公司都會提供更高的薪資來吸引高水準的開發人員。 對於IT行業新人來說,想要進入IT行業找到滿意的工作,首先應該選擇適合的職位。 那麼IT行業究竟有哪些職位呢?哪些崗 ...
  • 說明:轉載至自 邊城的理解 JavaScript 的 async/await async 和 await 在乾什麼 任意一個名稱都是有意義的,先從字面意思來理解。async 是“非同步”的簡寫,而 await 可以認為是 async wait 的簡寫。所以應該很好理解 async 用於申明一個 fun ...
  • JavaScript對於已經看到這篇博客的鐵子已近有了瞭解。 這篇博客寫一個效果:點擊按鈕跟換表格: 源碼下載 : https://files.cnblogs.com/files/2979100039-qq-con/jqy_example_01.zip 上一張效果圖: 點擊按鈕更換皮膚: 其他的就不 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...