文檔對(duì)象模型Document Object ModelDOM(Document Object Model,文檔對(duì)象模型)是一個(gè)通過(guò)和JavaScript進(jìn)行內(nèi)容交互的API,。Javascript和DOM一般經(jīng)常作為一個(gè)整體,,因?yàn)镴avascript通常都是用來(lái)進(jìn)行DOM操作和交互的。 主要內(nèi)容來(lái)自:http://net./tutorials/javascript-ajax/javascript-and-the-dom-series-lesson-1/ 關(guān)于DOM,,有些知識(shí)需要注意:
2. DOM為web文檔創(chuàng)建帶有層級(jí)的結(jié)果,這些層級(jí)是通過(guò)node節(jié)點(diǎn)組成,,這里有幾種DOM node類型,,最重要的是Element, Text, Document。
3. 每個(gè)引擎對(duì)DOM標(biāo)準(zhǔn)的實(shí)現(xiàn)有一些輕微的不同,。例如,,F(xiàn)irefox瀏覽器使用的Gecko引擎有著很好的實(shí)現(xiàn)(盡管沒(méi)有完全遵守W3C規(guī)范),但I(xiàn)E瀏覽器使用的Trident引擎的實(shí)現(xiàn)卻不完整而且還有bug,,給開(kāi)發(fā)人言帶來(lái)了很多問(wèn)題,。 如果你正在使用Firefox,我推薦你立即下載Firebug插件,,對(duì)于你了解DOM結(jié)構(gòu)非常有用,。 Web上的JavaScriptScript元素當(dāng)你在網(wǎng)站頁(yè)面上使用JavaScript的時(shí)候,需要使用SCRIPT元素: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www./TR/xhtml1/DTD/xhtml1-strict.dtd"> 上述代碼,,嚴(yán)格來(lái)說(shuō)SCRIPT的TYPE屬性應(yīng)該設(shè)置為application/javascript,,但是由于IE不支持這個(gè),所以平時(shí)我們不得不寫(xiě)成text/javascript或者直接去掉type,。另外你也可以看到在SCRIPT元素里的注釋行// <![CDATA[ 是用來(lái)告訴支持XHTML的瀏覽器,,這里面的代碼是字符數(shù)據(jù)而不是XHTML標(biāo)簽,比如如果你在里面的數(shù)據(jù)使用了<或>,,瀏覽器就不會(huì)再解析成XHTML標(biāo)簽了,。 Defer屬性任何在SCRIPT元素里聲明的代碼在頁(yè)面加載的時(shí)候都會(huì)運(yùn)行,唯一一個(gè)例外是給SCRIPT元素加上一個(gè)defer屬性,。defer屬性告訴瀏覽器加載完HTML文檔以后再執(zhí)行JS代碼,,但這個(gè)屬性只能在IE下使用。 連接外部腳本如果你想了解外部腳本,,只需要簡(jiǎn)單地在SCRIPT上使用SRC屬性就行了,,使用單獨(dú)的JS文件的好處是可以緩存,而且也不需要擔(dān)心CDATA方面的問(wèn)題: <script type="text/javascript" src="my-script.js"></script> JavaScript必備在我們繼續(xù)DOM之前,,我們來(lái)復(fù)習(xí)一下JavaScript的核心必備知識(shí),如果你還不了解,,也沒(méi)關(guān)系,,我們?cè)谶@一章節(jié)將稍微花點(diǎn)時(shí)間來(lái)回顧一下。 JavaScript有幾種數(shù)據(jù)類型:Number, String, Boolean, Object, Undefined and Null,。 單行注釋使用雙斜杠//,,雙斜杠后面的所有文字都會(huì)被注釋掉,多行注意使用/*和*/括住。 Number在JavaScript里所有的Number都是浮點(diǎn)型的,,當(dāng)聲明一個(gè)數(shù)字變量的時(shí)候,記得不要使用任何引號(hào)。 // 注:使用var類聲明變量 StringJavaScript里聲明字符串特別簡(jiǎn)單,,和其它語(yǔ)言一樣,,在JS里使用單引號(hào)或雙引號(hào)都可以。 var firstPart = 'Hello'; Boolean布爾類型用于條件判斷,,布爾類型是只有2個(gè)值:true和false。任何使用邏輯操作符的比較都會(huì)返回布爾值,。 5 === (3 + 2); // = true ===也是比較操作符,,不僅比較數(shù)值,還比較類型,。 Function函數(shù)是特殊的對(duì)象,。 // 使用function操作符來(lái)聲明新函數(shù) Array數(shù)組也是特殊的對(duì)象,,它包含了一批值(或?qū)ο螅?,訪問(wèn)這些數(shù)據(jù)的話需要使用數(shù)字索引: // 2種方式聲明數(shù)組 Object一個(gè)對(duì)象是一個(gè)key-value的集合,和數(shù)組相似,,唯一的不同是你可以為每個(gè)數(shù)據(jù)定義一個(gè)名稱,。 // 2種類型定義Object對(duì)象 IF/Else語(yǔ)句JS里使用最多的語(yǔ)句莫過(guò)于條件語(yǔ)句了: var legalDrinkingAge = 21; JavaScript操作符建議你訪問(wèn)這個(gè)頁(yè)面來(lái)查看所有的JS操作符,這里我僅僅給出一些例子: // 加減乘除 Loop循環(huán)Loop循環(huán)在是遍歷數(shù)組或者對(duì)象的所有成員的時(shí)候非常方便,,JavaScript里使用最多的是FOR和WHILE語(yǔ)句,。 var envatoTutSites = ['NETTUTS', 'PSDTUTS', 'AUDIOTUTS', 'AETUTS', 'VECTORTUTS']; DOM正文訪問(wèn)DOM節(jié)點(diǎn)我們來(lái)個(gè)例子,,一個(gè)HTML里包含一段文本和一個(gè)無(wú)序的列表,。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www./TR/xhtml1/DTD/xhtml1-strict.dtd"> 上面例子里,我們使用getElementById DOM方法來(lái)訪問(wèn)p段落,,在SCRIPT里添加如下代碼: var introParagraph = document.getElementById('intro'); 變量introParagraph現(xiàn)在已經(jīng)引用到該DOM節(jié)點(diǎn)上了,我們可以對(duì)該節(jié)點(diǎn)做很多事情,,比如查詢內(nèi)容和屬性,,或者其它任何操作,甚至可以刪除它,,克隆它,,或者將它移到到DOM樹(shù)的其它節(jié)點(diǎn)上。 文檔上的任何內(nèi)容,,我們都可以使用JavaScript和DOM API來(lái)訪問(wèn),,所以類似地,,我們也可以訪問(wèn)上面的無(wú)序列表,唯一的問(wèn)題是該元素沒(méi)有ID屬性,,如果ID的話就可以使用相同的方式,,或者使用如下getElementsByTagName方式: var allUnorderedLists = document.getElementsByTagName('ul'); getElementsByTagNamegetElementsByTagName方法返回的是一個(gè)節(jié)點(diǎn)集合,和數(shù)組類似也有l(wèi)ength屬性,,重要的一個(gè)特性是他是live的——如果你在該元素里添加一個(gè)新的li元素,,這個(gè)集合就會(huì)自動(dòng)更新,介于他和數(shù)組類型,,所以可以和訪問(wèn)數(shù)組一樣的方法來(lái)訪問(wèn),,所以從0開(kāi)始: // 訪問(wèn)無(wú)序列表: [0]索引 以下圖例更清晰地展示了DOM獲取的知識(shí): DOM穿梭“穿梭”這個(gè)詞主要是用來(lái)描述通過(guò)DOM查找節(jié)點(diǎn),DOM API提供了大量的節(jié)點(diǎn)屬性讓我們來(lái)往上或者往下查詢節(jié)點(diǎn),。 所有的節(jié)點(diǎn)都有這些屬性,,都是可以用于訪問(wèn)相關(guān)的node節(jié)點(diǎn):
通過(guò)這張圖,理解起來(lái)就簡(jiǎn)單多了,,但有個(gè)非常重要的知識(shí)點(diǎn):那就是元素之間不能有空格,,如果ul和li之間有空格的話,就會(huì)被認(rèn)為是內(nèi)容為空的text node節(jié)點(diǎn),,這樣ul.childNodes[0]就不是第一個(gè)li元素了,。相應(yīng)地,<p>的下一個(gè)節(jié)點(diǎn)也不是<ul>,,因?yàn)?lt;p>和<ul>之間有一個(gè)空行的節(jié)點(diǎn),,一般遇到這種情況需要遍歷所有的子節(jié)點(diǎn)然后判斷nodeType類型,1是元素,,2是屬性,,3是text節(jié)點(diǎn),詳細(xì)的type類型可以通過(guò)此地址: Node.ELEMENT_NODE == 1 總結(jié)原生的DOM方法和屬性足夠我們?nèi)粘5膽?yīng)用了,,本章節(jié)我們只列舉了一些例子,,下一章節(jié)我們列舉更多的例子,還會(huì)包括瀏覽器事件模型,。 同步與推薦本文已同步至目錄索引:深入理解JavaScript系列 深入理解JavaScript系列文章,,包括了原創(chuàng),翻譯,,轉(zhuǎn)載等各類型的文章,,如果對(duì)你有用,請(qǐng)推薦支持一把,,給大叔寫(xiě)作的動(dòng)力,。 |
|
來(lái)自: andorcba > 《javascript》