Javascript & DHTML DOM基礎和基本API第1/5頁_javascript技巧
May 16, 2016 pm 07:03 PM一、什么是DOM?
什么叫DOM,DOM是文檔對象模型(Document?Object?Model,是基于瀏覽器編程(在本教程中,可以說就是DHTML編程)的一套API接口,W3C出臺的推薦標準,每個瀏覽器都有一些細微的差別,其中以Mozilla的瀏覽器最與標準接近。單純的Javascript要結(jié)合DOM才能做DHTML編程,才能做出漂亮的效果、應用于WEB。這點幾乎與其它的語言無異,正如C/C++需要庫支持是一樣的道理。否則就是單純的在語法上做研究了。因此,必須要對DOM有一定的認識,才能把Javascript應用于WEB,或你的RIA應用當中,因為DHTML本質(zhì)上就是操作DOM樹。
以后的編程當中,希望你能夠把DHTML.chm這本手冊也拿上,如果你需要兼容gecko,把gecko的DOM手冊也帶上。因為API太多,想不起來的接口還可以查這本手冊。
如果你要測試瀏覽器是否是支持DOM的,簡單的一句就可以判斷
<script> var isSupportDOM = !!document.getElementById; //兩個取反,這已經(jīng)在上節(jié)中說過了,意思是強制轉(zhuǎn)型 alert("你的瀏覽器 " +(isSupportDOM?"":"不")+ "支持 DOM!"); </script>
二、DOM樹
要注意:DOM樹的根統(tǒng)一為文檔根—document,DOM既然是樹狀結(jié)構(gòu),那么他們自然有如下的幾種關(guān)系:
根結(jié)點(document)
父結(jié)點(parentNode)
子結(jié)點(childNodes)
兄弟結(jié)點 兄弟結(jié)點
(sibling) (sibling)
例子:
假設網(wǎng)頁的HTML如下
程序代碼
我們參照樹的概念,畫出該HTML文檔結(jié)構(gòu)的DOM樹:
html
body head
div title
文本 文本
從上面的圖示可以看出
html有兩個子結(jié)點,而html就是這兩個子節(jié)點的父結(jié)點
head有節(jié)點title,title下有一個文本節(jié)點
doby下有節(jié)點div,div下有一個文本節(jié)點
三、操作DOM樹
開篇已經(jīng)說過,DHTML本質(zhì)就是操作DOM樹。如何操作它呢?
假設我要改變上面HTML文檔中div結(jié)點的文本,如何做?
程序代碼
<script> <br/> function changedivText (strText) { <br/> var nodeRoot = document; //這個是根結(jié)點 <br/> var nodeHTML = nodeRoot.childNodes[0]; //這個是html結(jié)點 <br/> var nodeBody = nodeHTML.childNodes[1]; //body結(jié)點 <br/> var nodeDiv = nodeBody.childNodes[0]; //DIV結(jié)點 <br/> var nodeText = nodeDiv.childNodes[0];//文本結(jié)點' <br/> nodeText.data = strText; //文本節(jié)點有data這個屬性,因此我們可以改變這個屬性,也就成功的操作了DOM樹中的一個結(jié)點了 <br/> } <br/> </script>
從上面的示例可以看出,我們可以用上面的這種方法操作DOM樹上的任一節(jié)點。(注:1. 跨域除外,跨域通常是在操作frame上,簡單的說,就是兩個frame不屬于同一域名。2.上面的操作為了演示,采用的方法是從根結(jié)點一直到文本結(jié)點的遍歷,在DOM方法上,有更簡潔的方法,這些以后會有更多示例加以說明,下文中也會有介紹)
三、DOM節(jié)點。
細心些的朋友也許發(fā)現(xiàn)了,在上面寫的HTML代碼時用<>與>包函起來的就是一個結(jié)點,事實上是這樣的嗎?答案是否定的。下面就是說說節(jié)點類型,否則在有的時候是會犯錯誤的。比如,你把上面的代碼放到Mozilla firefox的瀏覽器里運行一下,就會知道了。
DOM中的結(jié)點類型比較多,這里寫一些在HTML文檔中(注:XML也是DOM樹結(jié)構(gòu))常見的幾種結(jié)點類型。
1、DOCUMENT_NODE
(document)文檔根結(jié)點類型,該枚舉型的值是9.
2、ELEMENT_NODE
(element)元素結(jié)點類型,該枚舉型的值是1。上文中的html, body, div這些結(jié)點都是屬于該類型。
3、TEXT_NODE
(text)文本結(jié)點類型,該枚舉型的值是3。上文中的文本,如:tutorial of DHTML and javascript programming就是屬于該類型。
(注:一個空格也就可能是一個文本結(jié)點)
通常更需要注意的是文本結(jié)點,有可能一個回車,一個空格都是文本結(jié)點。這一點以后會碰到,當然,我們也有辦法處理,這里先不要急,以后也會說到的。
四、DOM常用的API
這些常用的API是要記下來的,當然在非IE的瀏覽器里也會有效,是符合w3c的。這些API在以后的編程中會常常用到。正如每個編程平臺所提供的API一樣,常用必須記下來,節(jié)省時間從而提高編程效率。只寫幾個最常用的,其它的API會在以后的示例中寫出。由淺而深,從易到難嘛。
1、獲取ELEMENT_NODE,元素節(jié)點
1)、方法:document.getElementById(元素的Id),返回值為元素的節(jié)點引用。可以假想一下這個API的原理:象我們上面所做的是遍歷每個節(jié)點(從根到我們所需結(jié)點),這個API,也可以想成是從根遍歷,查詢每個結(jié)點(空白結(jié)點和空結(jié)點除外),并獲取該結(jié)點的id是否為指定的ID,如果是的話,就返回這個結(jié)點(注:在JS中,數(shù)組和對象是引用類型),如果沒有就返回空。我們可以寫寫這個代碼,幫助我們理解document.getElementById。下面是一個簡單遍歷BODY中元素的示例。
<html> <head> <title>never-online's website</title> <script> function myGetElementById (id) { var nodeRoot = document; //這個是根結(jié)點 var nodeHTML = nodeRoot.childNodes[0]; //這個是html結(jié)點 var nodeBody = nodeHTML.childNodes[1]; //body結(jié)點 var bodyChild = nodeBody.childNodes; //body的孩子 for (var i=0; i<bodyChild.length; i++) { //簡單的遍歷(指body的孩子下的深度為1) if (bodyChild[i].id==id) return bodyChild[i]; }; return null; } function TestGetElementById (id) { var node = myGetElementById(id); if (node!=null) { alert("找到結(jié)點 "+id+"!"); alert(node.childNodes[0].data); } else { alert("沒有找到結(jié)點 "+id+"."); } } </script> </head> <body> <div id="aTestNode"></div> <div id="textNode">tutorial of DHTML and javascript programming</div> <input onclick="TestGetElementById('textNode')" type="button" value="change"/> </body> </html>
2)、屬性:object.innerHTML,返回值:一個節(jié)點內(nèi)的HTML值。該屬性為可寫屬性。它雖然不是獲取結(jié)點,但經(jīng)常與獲取結(jié)點相結(jié)合,所以我把它放在獲取結(jié)點這一類,它的屬性就類似于是純文本節(jié)點屬性中的data。以document.getElementById和object.innerHTML這兩個API為例,我們就可以把上面所寫的代碼簡化一下了,示例如下:
<html> <head> <title>never-online's website</title> <script> function changedivText (strText) { var node = document.getElementById("textNode"); node.innerHTML = strText; } </script> </head> <body> <div id="textNode">tutorial of DHTML and javascript programming</div> <input onclick="changedivText('change?')" type="button" value="change"/> </body> </html>
3)、方法:object.getElementsByTagName(標簽的名字),返回一個集合,該集合的把有元素都是有指定標簽的元素。訪問集合里的元素,可以用下標來訪問。語法里的object,是指document(根)或者是一個ELEMENT_NODE。這個的原理示例我就不寫了,可以作為一個作業(yè),大家可以寫寫。這里寫一些具體應用。如上例,我們還可以這樣寫。
<html> <head> <title>never-online's website</title> <script> function changedivText (strText) { var node = document.getElementsByTagName("DIV"); node[0].innerHTML = strText; } </script> </head> <body> <div>tutorial of DHTML and javascript programming</div> <input onclick="changedivText('change?')" type="button" value="change"/> </body> </html>
再取一個例子,注意,BODY下的結(jié)點深度為2。
<html> <head> <title>never-online's website</title> <script> function changedivText (strText) { var node = document.getElementById("nodeTest"); var myNode = node.getElementsByTagName("DIV"); myNode[0].innerHTML = strText; } </script> </head> <body> <div id="nodeTest"> <div>tutorial of DHTML and javascript programming</div> <input onclick="changedivText('change?')" type="button" value="change"/> </div> </body> </html>
二、動態(tài)創(chuàng)建與插入結(jié)點
1)、創(chuàng)建結(jié)點對象。document.createElement(tagname),tagname指的是一個標簽,比如一個DIV,就是document.createElement("DIV"),它返回的是這個結(jié)點的引用。
2)、在body的尾部插入結(jié)點用document.body.appendChild(object),為了容易理解,下面這個示例,我用了IE專有的屬性object.outerHTML,得到一個該元素的HTML標簽內(nèi)容(包括自身),這樣會更容易看到效果。
<html> <head> <title>never-online's website</title> <script> function insertNode (strText) { alert("插入元素前的body HTML:\n" +document.body.outerHTML); var node = document.createElement("DIV"); node.innerHTML = strText; document.body.appendChild(node); alert("插入元素后的body HTML:\n" +document.body.outerHTML); } </script> </head> <body> <div>tutorial of DHTML and javascript programming</div> <input onclick="insertNode('change?')" type="button" value="change"/> </body> </html> [/htm] 3)、在元素處插入結(jié)點。object.insertBefore(oNewNode [, oChildNode]),oNewNode為一個我們創(chuàng)建的結(jié)點,oChildNode是可選的,為object下的一個子節(jié)點。同樣的,為了看到效果,我也用了outerHTML。示例 [html] <html> <head> <title>never-online's website</title> <script> function insertNode (strText) { alert("插入元素前的body HTML:\n" +document.body.outerHTML); var node = document.createElement("DIV"); var myNode = document.getElementById("textNode"); node.innerHTML = strText; document.body.insertBefore(node,myNode); alert("插入元素后的body HTML:\n" +document.body.outerHTML); } </script> </head> <body> <div id="textNode">tutorial of DHTML and javascript programming</div> <input onclick="insertNode('change?')" type="button" value="change"/> </body> </html>
三、移除結(jié)點。
1) object.parentNode.removeChild(oChildNode),這個就是語法,下面看示例。
<html> <head> <title>never-online's website</title> <script> function insertNode (strText) { alert("插入元素前的body HTML:\n" +document.body.outerHTML); var node = document.createElement("DIV"); var myNode = document.getElementById("textNode"); node.innerHTML = strText; document.body.insertBefore(node,myNode); alert("插入元素后的body HTML:\n" +document.body.outerHTML); } function removeCreateNode() { alert("移除元素前的body HTML:\n" +document.body.outerHTML); var node = document.getElementById("textNode"); node.parentNode.removeChild(node); alert("移除元素前的body HTML:\n" +document.body.outerHTML); } </script> </head> <body> <div id="textNode">tutorial of DHTML and javascript programming</div> <input onclick="insertNode('change?')" type="button" value="insert"/> <input onclick="removeCreateNode()" type="button" value="remove"/> </body> </html>
這一節(jié)就先寫到這里,下一節(jié)我們就可以用這幾個簡單的API做許多事情了,幾個API就可以寫出很多效果

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Oracle是一家全球知名的資料庫管理系統(tǒng)供應商,其API(ApplicationProgrammingInterface,應用程式介面)是一種強大的工具,可協(xié)助開發(fā)人員輕鬆地與Oracle資料庫互動和整合。在本文中,我們將深入探討OracleAPI的使用指南,向讀者展示如何在開發(fā)過程中利用資料介面技術(shù),同時提供具體的程式碼範例。 1.Oracle

JavaScript教學:如何取得HTTP狀態(tài)碼,需要具體程式碼範例前言:在Web開發(fā)中,經(jīng)常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經(jīng)常需要取得傳回的HTTP狀態(tài)碼來判斷操作是否成功,並根據(jù)不同的狀態(tài)碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態(tài)碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

OracleAPI整合策略解析:實現(xiàn)系統(tǒng)間無縫通信,需要具體程式碼範例在當今數(shù)位化時代,企業(yè)內(nèi)部系統(tǒng)之間需要相互通信和資料共享,而OracleAPI就是幫助實現(xiàn)系統(tǒng)間無縫通信的重要工具之一。本文將從OracleAPI的基本概念和原則入手,探討API整合的策略,最終給出具體的程式碼範例幫助讀者更好地理解和應用OracleAPI。一、OracleAPI基本

JavaScript中的HTTP狀態(tài)碼取得方法簡介:在進行前端開發(fā)中,我們常常需要處理與後端介面的交互,而HTTP狀態(tài)碼就是其中非常重要的一部分。了解並取得HTTP狀態(tài)碼有助於我們更好地處理介面?zhèn)骰氐馁Y料。本文將介紹使用JavaScript取得HTTP狀態(tài)碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態(tài)碼HTTP狀態(tài)碼是指當瀏覽器向伺服器發(fā)起請求時,服務

標題:如何處理LaravelAPI報錯問題,需要具體程式碼範例在進行Laravel開發(fā)時,常會遇到API報錯的情況。這些報錯可??能來自於程式碼邏輯錯誤、資料庫查詢問題或是外部API請求失敗等多種原因。如何處理這些報錯是一個關(guān)鍵的問題,本文將透過具體的程式碼範例來示範如何有效處理LaravelAPI報錯問題。 1.錯誤處理在Laravel

PHPAPI介面:如何使用InsomniaInsomnia是一款功能強大的API測試和偵錯工具,它能夠幫助開發(fā)者快速、方便地測試和驗證API接口,支援多種程式語言和協(xié)議,其中包括PHP。本文將介紹如何使用Insomnia測試PHPAPI介面。第一步:安裝InsomniaInsomnia是一款跨平臺的應用程序,支援Windows、MacOS和Linux等

JavaScript和WebSocket:打造高效率的即時搜尋引擎引言:隨著網(wǎng)路的發(fā)展,使用者對即時搜尋引擎的要求也越來越高。傳統(tǒng)的搜尋引擎在進行搜尋時,使用者需要點擊搜尋按鈕後才能得到結(jié)果,這種方式無法滿足使用者對於即時搜尋結(jié)果的需求。因此,採用JavaScript和WebSocket技術(shù)來實現(xiàn)即時搜尋引擎成為了一個熱門的話題。本文將詳細介紹使用JavaScri

隨著網(wǎng)路和行動裝置的普及,WebService(網(wǎng)路服務)已成為一個不可或缺的技術(shù)?,F(xiàn)在,WebService已經(jīng)成為一個標準化的通訊協(xié)議,因此它可以被各種系統(tǒng)完成。而在PHP開發(fā)中,WebService也是一個非常重要且常見的技術(shù)。本文將探討PHP中的Web服務,包括基礎知識與使用方法。 1.什麼是Web服務? Web服務的概念,是指在Web上提供
