DOM 是什麼?
百度文庫的DOM介紹完全看不明白,能不能用生動形象簡明易懂舉例比喻的方法給我解釋下什麼是DOM,有什麼用,怎麼學。
&&&&
周杰倫&
&
例如上面這個例子…
參考一下我的另一篇回答:http://www.zhihu.com/question/33453164/answer/56549408
就是將XML(或者HTML)內的節點定義成基本統一的對象數據可以供程序語言(如javaScript)控制的技術規範。
1 什麼是 DOM
- 你可以把 DOM 看成節點
- 上圖是一個 html 文件,也就是網頁的結構。
- html 標籤是一個節點(Node)。
- head、title、body、p 標籤都是節點。
- 嵌套其他節點的節點叫做父節點。
- 被嵌套的節點叫做子節點。
- 同一個父節點下的節點叫做兄弟節點。
- 父親的父親以及上溯十八代祖宗叫做祖先節點。
- 兒子的兒子以及子子孫孫無窮匱也叫做後代節點。
2 DOM 有什麼用
- 通過 DOM 你可以改變網頁。
- 你可以使用 Javascript 語言來操作 DOM 以改變網頁。
- 為了改變網頁,你必須告訴 Javascript 改變哪一個節點。這就是操作 DOM。
- 比如:
var x = document.querySelector("p");
alert(x);
- 第一行就是使用 Javascript 訪問 document 節點,然後訪問節點中的第一個 P 節點,將這個節點傳遞給變數 x。等一下?什麼是 document 節點? Html 文件里沒這個標籤啊?整個 Html 文件就是 document 節點。
- 第二行通過 alert(x) 使瀏覽器彈出上面紅圈內的內容,提示 x 是一個 html段落對象,p 就是段落,p 的類型就是對象。
- 如果你再輸入
x.innerHTML = "第一次成功的改變了DOM"
就會改變 P 內的內容。
- 如果你為以上內容綁定一個滑鼠動作(事件),比如 onclick (滑鼠點擊事件):
var x = document.querySelector("p");
x.onclick = function(){
x.innerHTML = "第一次成功的改變了DOM";
}
在一個網頁中按下 F12,你的瀏覽器會打開控制台(Console),你輸入
- 當你在知乎的搜索欄輸入數據時,Javascript 捕獲到了你的輸入,對伺服器使用非同步查詢,動態顯示搜索結果。
- 當你向下滑動時,Javascript 捕獲到了你滑動的距離,根據距離的大小來判斷是否改變 DOM,進而讓頂部的導航欄跟隨瀏覽器窗口滾動,免得你回頭去找。
- 當你點擊修改按鈕時,Javascript 捕獲到了這個按鈕的滑鼠點擊事件,反饋了一個可編輯的答案給你。
- 練習,練習,練習。
- document.getElementById("wonb"),訪問 id 為 wonb 的節點。
- document.getElementsByClassName("yesninb"),訪問 class 為 yesninb 的節點。注意,class 在 DOM 中允許出現多次(廢話這就是 class 存在的意義),因此哪怕只有一個 class 為 yesninb 的節點,返回的也是一個數組。
- 既然是數組,如果你將它傳遞給 var y,那麼你訪問這唯一的該死的節點時,就要使用 y[0],而不是 y,因為 y 代表的是數組而不是它其中的元素。
4 如果你看懂了
- 你可以隨便搜索一下 DOM,結合自己的 html 文件練習一下操作常用 DOM 節點的方式。
- W3C 等入門網站介紹了常用的 DOM 方法。
- 多做。看一個方法,實踐一下。
5 如果你看不懂
- 去學 HTML , 以及 Javascript 的前三章。
6 進階
- Javascript 不能夠真正改變 DOM,它僅僅是改變呈現內容,當你刷新的時候就會發現我靠這怎麼他媽的什麼都還原了。
- 但是你可以把這些改變用請求的方式傳遞給後端語言介面,由後端語言比如 PHP Python Java Node等來進行後續的操作,它們接到你的請求之後就去修改伺服器數據,這樣改變就生效了。
- 但是用戶的交互比如彈窗、滑過變色等等根本沒必要讓伺服器也跟著摻和,why? 因為交互只是暫時的,用完了,還要變成默認的,不需要保存到伺服器,只要保證交互的時候有反饋就行了。
- 這就是前端。
- HTML 表達靜態結構(網頁有哪些元素,每個元素代表什麼意義,元素包含了什麼內容)
- CSS 呈現美化(元素的顏色,形狀,布局)
- Javascript 負責動態交互(操作 DOM,使用 Ajax 進行非同步刷新,與伺服器交互)
你種一棵小樹,給每一片葉子做標誌,然後從樹根開始找到每一片唯一的葉子。這就是DOM
轉載自:XML DOM解析 基礎概念 - 聖騎士wind - 博客園
W3C制定了一套書寫XML分析器的標準介面規範——DOM
應用程序開發過程中,應用程序不是直接對XML文檔進行操作的,而是首先由XML分析器對XML文檔進行分析。
然後,應用程序通過XML分析器所提供的DOM介面或SAX介面對分析結果進行操作,從而間接地實現了對XML文檔的訪問。
DOM介紹 優缺點分析
DOM: Document Object Model 文檔對象模型。
在應用程序中,基於DOM的XML分析器將一個XML文檔轉換成一個對象模型的集合(通常稱DOM樹),應用程序通過對這個對象模型的操作,來實現對XML文檔數據的操作。
通過DOM介面,應用程序可以在任何時候訪問XML文檔中的任何一部分數據,因此,這種利用DOM介面的機制也被稱作隨機訪問機制。
DOM樹所提供的隨機訪問方式給應用程序的開發帶來了很大的靈活性,它可以任意地控制整個XML文檔中的內容。
然而,由於DOM分析器把整個XML文檔轉化成DOM樹放在了內存中,因此,當文檔比較大或結構比較複雜時,對內存的需求就比較高。
而且,對於結構複雜的樹的遍歷也是一項耗時的操作。
所以,DOM分析器對機器性能的要求比較高,實現效率不十分理想。
由於DOM分析器所採用的樹結構的思想與XML文檔的結構相吻合,同時鑒於隨機訪問所帶來的方便,因此,DOM分析器還是有很廣泛的應用價值的。
DOM的組成
對於XML應用開發來說,DOM就是一個對象化的XML數據介面,一個與語言無關、與平台無關的標準介面規範。
DOM定義了HTML文檔和XML文檔的邏輯結構,給出了一種訪問和處理這兩種文檔的方法。
文檔代表的是數據,而DOM則代表了如何去處理這些數據。
作為W3C的標準介面規範,目前,DOM由三部分組成,包括:核心(core)、HTML介面和XML介面。
核心部分是結構化文檔比較底層對象的集合,這一部分所定義的對象已經完全可以表達出任何HTML和XML文檔中的數據了。
HTML介面和XML介面兩部分則是專為操作具體HTML文檔和XML文檔所提供的高級介面。
DOM樹
一個XML文檔及其所對應的DOM樹如下:
&
& 29.99&
&
&
&
&J K. Rowling&
&
&
& 30.00&
&
&
&Giada De Laurentiis&
&
&
& 39.95&
&
&
&Erik T. Ray&
&
&
& 49.99&
&
&
&James McGovern&
&Per Bothner&
&Kurt Cagle&
&James Linn&
&Vaidyanathan Nagarajan&
&
&
&
要嚴格區分XML文檔樹中的根節點與根元素節點:
文檔(根節點)和根元素節點是兩回事。
根節點代表整個文檔,是我們解析XML文檔的入口,通過它獲取到Document對象;
根元素節點代表XML文檔的根元素,必須要在獲得Document對象之後才能一層一層地去訪問它的元素。
DOM模型結構
最常見的節點類型:
元素:元素是XML的基本構建。
元素可以有其他元素、文本節點或兩者兼有來作為其子節點。
元素節點還是可以有屬性的唯一類型的節點。
屬性:屬性節點包含關於元素節點的信息,但實際上,不認為它是元素的子節點。
文本:確切來講,文本節點是文本。它可以包含許多信息或僅僅是空白。
文檔(根節點) :文檔節點是整個文檔中所有其他節點的父節點。(根節點不等於根元素節點)。
較不常見的節點類型:CDATA、注釋、處理指令。
DOM的四個基本介面
在DOM介面規範中,有四個基本的介面:Document, Node, NodeList, NamedNodeMap。
Document
Document介面是對文檔進行操作的入口,它是從Node介面繼承過來的。
Node
Node介面是其他大多數介面的父類。
在DOM樹中,Node介面代表了樹中的一個節點。
NodeList
NodeList介面是一個節點的集合,它包含了某個節點中的所有子節點。
它提供了對節點集合的抽象定義,並不包含如何實現這個節點集的定義。
NodeList用於表示有順序關係的一組節點,比如某個節點的子節點序列。
在DOM中,NodeList的對象是live的,對文檔的改變,會直接反映到相關的NodeList對象中。
NamedNodeMap
NamedNodeMap介面也是一個節點的集合,通過該介面,可以建立節點名和節點之間的一一映射關係,從而利用節點名可以直接訪問特定的節點,這個介面主要用在屬性節點的表示上。
儘管NamedNodeMap所包含的節點可以通過索引來進行訪問,但是這只是提供了一種枚舉方法,NamedNodeMap所包含的節點集中節點是無序的。
與NodeList相同,在DOM中,NamedNodeMap對象也是live的。
XML(或HTML)就是一個層次型的文件格式,裡面有元素,屬性,文本等內容。如下面的XML示例:
&
&
& 30.00&
&
&
&Giada De Laurentiis&
&
&
& 39.95&
&
&
&Erik T. Ray&
&
&
&
(示例來源:http://www.w3schools.com/xquery/xquery_example.asp)
但是要修改XML文件添加一個元素或者修改一個元素的文本不是很容易的事情。
DOM就是XML文檔在內存中的表示形式,如下圖所示:
這樣便於通過編程的方式對節點進行操作,如獲取元素的文本,獲取屬性的值,增加子元素,修改元素的名稱,增加屬性,刪除屬性,修改屬性的值。
xmlDoc=loadXMLDoc("books.xml");
newel=xmlDoc.createElement("edition");
x=xmlDoc.getElementsByTagName("book")[0];
x.appendChild(newel);
(示例來源:http://www.w3schools.com/dom/dom_nodes_add.asp)
要修改XML的時候,要先將XML載入到內存,形成一個DOM的樹,可以對這個內存中的樹進行操作,然後再寫到文件中。
本文的示例都來自W3CSchool,更多示例,請前往:http://www.w3schools.com/dom/default.asp什麼是DOM?
DOM全稱是Document Object Model(文檔對象模型),是為HTML和XML提供的API。那麼為什麼DOM可以同時提供給HTML和XML編程介面。雖然他們用來標記的標籤不同,但是他們本質的結構是相同的。換句話說,按照DOM的標準,HTML和XML都是以標籤為結點構造的樹結構,DOM將HTML和XML的相同的結構本質抽象出來,然後通過腳本語言,如Javascript,按照DOM里的模型標準訪問和操作文檔內容。
在Chrome瀏覽器端,單擊右鍵打開View Page Source展示文檔結構。通過這種方式可以直觀的看到文檔當前的內容和結構。DOM則不同,它是提供一個API給編程語言,比如Javascript,通過一系列抽象的方法操作文檔的內容,結構和樣式。這有點想SQL和Excel,Excel可以直觀的展示數據的結構,而SQL是一個負責操作數據的工具,幫助組織,更新,添加和刪除數據內容。
DOM 和 HTML是一回事嗎?就像很多人把JQuery和Javascript的本質搞混一樣,DOM和HTML也完全不是一回事,DOM是一個API,HTML(Hyper Text Markup Language)則是一種標記語言,HTML在DOM的模型標準中被視為對象,DOM只提供編程介面,卻無法實際操作HTML裡面的內容。
但是前端工程師,一般在瀏覽器端操作HTML。每個Web瀏覽器都會使用DOM,所以頁面可以被腳本語言訪問。而所有的瀏覽器都是以Javascript作為默認的腳本語言。所以HTML在瀏覽器端基本上可以直接通過DOM模型來操作,通過&