文檔對象模型(DOM),你只需知道這些就夠了!

来源:https://www.cnblogs.com/flyingweb/archive/2018/01/03/8175632.html
-Advertisement-
Play Games

文檔對象模型是用於HTML和XML文檔的應用程式編程介面,它定義文檔的邏輯結構,以及訪問和操作文檔的方式。 ...


官方定義——應用程式編程介面(API)

文檔對象模型是用於HTML和XML文檔的應用程式編程介面,它定義文檔的邏輯結構,以及訪問和操作文檔的方式

"The Document Object Model (DOM) is an application programming interface (API) for HTML and XML documents. It defines the logical structure of documents and the way a document is accessed and manipulated." —— W3C DOM

“文檔對象模型是用於HTML和XML文檔的應用程式編程介面”

應用程式編程介面(Application Program Interface,簡稱API),就是“提供商”將一個功能的具體實現(業務邏輯)封裝起來,只暴露給“客戶”可供調用的編程介面。如果客戶想使用某一功能,則只需調用該功能對應的編程介面,而無需關註於具體實現。打個比方,海爾生產空調,你購買空調後按照說明書操作空調就好,不需要知道空調是根據什麼原理造出來的。

對於DOM而言,“提供商”指的就是實現DOM的開發者(比如,開發JavaScript引擎V8的工程師),“客戶”指的就是使用DOM的開發者(比如,開髮網站的前端工程師)。他們之間共同遵守的就是DOM規範。

因此,DOM規範同時約束它的實現者和使用者。DOM實現者必須實現規範中定義的所有介面,DOM使用者應該調用規範中相應的介面實現相應的功能。

如果你是實現者,需要關註如何實現DOM API;如果你是使用者,則只需關註如何使用DOM API。

它定義文檔的邏輯結構,以及訪問和操作文檔的方式

上面這句話對 DOM API 作了更具體的解釋,包括三層意思:

  • 定義文檔的結構
  • 訪問文檔的方式
  • 操作文檔的方式

HTML DOM 是對 DOM Core 的擴展,添加了專門針對 HTML 文檔的特定對象和方法,它與現有的文檔對象模型一致。下麵我們就來討論如何使用 HTML DOM API 的問題。

一、如何定義文檔的邏輯結構?——節點對象樹

DOM規範,將網頁中的HTML文檔抽象為記憶體中的節點對象樹(DOM Tree)。樹中的每一個節點對象對應HTML文檔中的一個元素。

節點對象樹

 

二、如何訪問文檔?——訪問節點對象

(0) Document 介面作為文檔入口

Document 介面代表整個文檔。JavaScript 中的全局對象 document 是對 Document 介面的實現。

(1) 直接訪問文檔中的節點對象。

方法 描述
document.getElementsById("id"); 通過 id 屬性獲取節點對象
document.getElementsByName("name"); 通過 name 屬性獲取節點對象
document/element.getElementsByTagName("tag"); 通過 tag 屬性獲取節點對象
document/element.getElementsByClassName("class1[ class2]"); 通過 class 屬性獲取節點對象
document/element.querySelector("selector"); 通過 css 選擇器 獲取首個節點對象
document/element.querySelectorAll("selector"); 通過 css 選擇器 獲取所有節點對象

(2) 通過節點關係訪問一個節點周圍的節點對象。

關係 屬性 描述
父節點(parent node) parentNode/parentElement 獲取所屬父節點對象
  ownerDocument 獲取節點所屬文檔節點(根節點)對象
兄弟節點(sibling nodes) nextSibling
nextElementSibling
獲取前一個兄弟節點對象
獲取前一個兄弟元素節點對象
  previousSibling
previousElementSibling
獲取後一個兄弟節點對象
獲取後一個兄弟元素節點對象
子節點(child nodes) childNodes
children
獲取所有子節點對象
獲取所有子元素節點對象
  hasChildNodes(); 判斷是否包含子節點對象
  childElementCount 獲取子元素節點對象數量
  firstChild
firstElementChild
獲取第一個子節點對象
獲取第一個子元素節點對象
  lastChild
lastElementChild
獲取最後一個子節點對象
獲取最後一個子元素節點對象

 

三、如何操作文檔?——操作節點對象

思路一:【節點對象】首先是一個【對象】,只要是對象就具有【屬性】和【行為】。

元素節點p作為對象,id,class,style(該屬性是一個對象)等作為對象的屬性,onclick,onfocus,oninput 等作為對象的行為,具體的動作由 JavaScript 代碼控制。

思路二:節點對象只包含屬性 —— 特性屬性樣式屬性行為(事件)屬性

2018-01-03_101557

將【行為】看作對象的一種屬性,以下實例印證了這一觀點:

捕獲1

我們獲取節點對象的目的,就是為了操作節點對象本身以及節點對象的屬性

(0) 操作節點對象本身

操作 方法 描述
創建節點 document.createElement("TAG");
document.createTextNode("#文本");
document.createComment("#註釋");
document.createDocumentFragment();
document.createAttribute("myAttrName");
創建一個元素節點
創建一個文本節點
創建一個註釋節點
創建一個空白的文檔片段節點
創建一個屬性節點
插入節點 parentNode.appendChild(newChild);
parentNode.insertBefore(newChild,refChild);
插入子節點(作為最後子節點)
插入子節點(在指定子節點之前)
刪除節點 parentNode.removeChild(oldChild); 刪除指定的子節點
替換節點 parentNode.replaceChild(newChild,oldChild); 替換一個子節點
克隆節點 node.cloneNode(deep); 克隆一個節點

(1) 操作節點對象的特性屬性

方法 描述
e.特性名稱[="value"]; 獲取/設置特性值
e.getAttributeNames(); 獲取已設置的全部屬性名稱(非IE內核)
e.getAttribute("特性名稱"); 獲取特性值
e.getAttributeNode("特性名稱"); 獲取特性節點[特性名稱=特性值]
e.setAttribute("特性名稱","特性值"); 設置特性值(不存在時新建該屬性)
e.setAttributeNode(Attr); 設置特性節點

(2) 操作節點對象的樣式屬性

方法 描述
e.style.color[ ="顏色值"] 獲取/設置標簽內樣式(內嵌樣式)
window.getComputedStyle(e).color;
document.defaultView.getComputedStyle(e).color;
獲取包括內嵌樣式、<style>、<link>在內的最終樣式(非IE內核 或 IE>8)
e.currentStyle.color 獲取包括內嵌樣式、<style>、<link>在內的最終樣式(IE內核)

(3) 操作節點對象的行為(事件)屬性

方法 描述
e.onclick[ =fun()];
e.onclick();
獲取/設置事件
觸發事件
e.addEventListener("type",listener,[useCapture]); 註冊事件(非IE內核 或 IE>8)
e.attachEvent("ontype",listener); 註冊事件(IE內核<11)
e.removeEventListener("type",listener,[useCapture]); 移除事件(非IE內核 或 IE>8)
e.detachEvent("ontype",listener); 移除事件(IE內核<11)
e.dispatchEvent(event) 調度(觸發)事件

(4) 操作節點對象的內容(屬性)

節點對象的內容,實際上是節點對象的子節點。傳統的方法是使用新創建的子節點替換需要修改的舊子節點。

<html>
    <body>
        <div>
            <p>第一個段落</p>
            <p>第二個段落</p>
        </div>
    </body>
</html>

<script>
    //獲取父節點
    var d = document.querySelector("div");
    //獲取需要替換的舊子節點
    var oldChild = d.firstChild;
    //創建新子節點
    var newChild = document.createTextNode("新的文本");
    //替換
    d.replaceChild(newChild ,oldChild );
</script>

如此常用的操作,卻有如此繁瑣的操作過程,況且一次只能替換一個子節點,這也太坑了吧!別急,DOM 規範為我們提供了更加簡便的操作。

轉換一下思路,我們將節點對象的內容看作是節點對象的一個屬性。那麼方法 e.innerHTML 屬性將以字元串的形式返回所有節點對象的內容。 e.innerHTML = newStr 將替換該內容。newStr 可以包含tag,替換的內容會自動轉換為節點對象(其實簡單的文本字元串,也會轉換成一個文本節點)。

<script>
    //獲取節點
    var d = document.querySelector("div");
    //修改節點內容
    var str = "新的文本";
    d.innerHTML= str;
</script>

最終的節點對象應該是下麵這張圖:

無標題

【The End】


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

-Advertisement-
Play Games
更多相關文章
  • 本文寫給有一定Promise使用經驗的人,如果你還沒有使用過Promise,這篇文章可能不適合你,建議先瞭解Promise的使用 Promise標準解讀 1.只有一個then方法,沒有catch,race,all等方法,甚至沒有構造函數 Promise標準中僅指定了Promise對象的then方法的 ...
  • 在使用Promise處理一些複雜邏輯的過程中,我們有時候會想要在發生某種錯誤後就停止執行Promise鏈後面所有的代碼。 然而Promise本身並沒有提供這樣的功能,一個操作,要麼成功,要麼失敗,要麼跳轉到then里,要麼跳轉到catch里。 如果非要處理這種邏輯,一般的想法是拋出一個特殊的Erro ...
  • 最近在逛各大網站,論壇,以及像SegmentFault等編程問答社區,發現Vue.js異常火爆,重覆性的提問和內容也很多,樓主自己也趁著這個大前端的熱潮,著手學習了一段時間的Vue.js,目前用它正在做自己的結業項目。 在做的過程中也對Vue.js的官方文檔以及其各種特性有了許多認識。作為一個之前以 ...
  • margin和padding的區別和用法 什麼是margin、padding? marigin:就是外邊距。padding:就是內邊距。怎麼就容易記住兩者呢? 馬蓉大家都知道吧,給王寶強帶帽子的那位,假如你認識了馬蓉是不是想離他遠點呢?而馬蓉的拼音是marong,是不是和margin特別像呢?那麼你 ...
  • 轉自:http://www.cnblogs.com/chiname/articles/216517.html(侵刪) /* * 方法:Array.removeAt(Index) * 功能:刪除數組元素. * 參數:Index刪除元素的下標. * 返回:在原數組上修改數組 */ /* * 方法:Arr ...
  • 今天在寫前端頁面的時候,覺得font-awesome簡單實用就上手試了一下,因為font-awesome圖標庫甚為強大,我就在其css上多做了一些嘗試,這一嘗試發現了一個致命的問題,當我對i標簽進行統一字體大小以及統一字體樣式的時候,發現了我的網頁在不同瀏覽器上的顯示問題,顯示如下: QQ瀏覽器: ...
  • React 可被靈活地運用在各種項目中。你可以用它創建新的應用程式,也可以逐漸地將其加入到現有的代碼庫中而無需重寫。 ...
  • 我使用的Ghost博客一直使用者預設的Casper主題。我向來沒怎麼打理過自己博客,一方面認為自己不夠專業,很難寫出質量比較高的文字;另一方面認為博客太耗時間,很容易影響正常的工作內容。最近公司即將搬遷,我的開發工作也告一段落,因此抽點時間自定義一個自己的博客主頁。 備註:上圖來自GhostChin ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...