文檔對象模型(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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...