基本介紹
文檔對象模型 (DOM) 是HTML和XML文檔的編程接口。它給文檔(結構樹)提供了一個結構化的表述并且定義了一種方式—程序可以對結構樹進行訪問,以改變文檔的結構,樣式和內容。
DOM 提供了一種表述形式將文檔作為一個結構化的節點組以及包含屬性和方法的對象。從本質上說,它將web 頁面和腳本或編程語言連接起來了。
從以上論述,我們大概知道:
- 文檔對象模型是HTML和XML文檔的編程接口(將web頁面和腳本連接了起來);
- 提供了一種表述形式將文檔作為一個結構化的節點組以及包含屬性和方法的對象;
為測試方便,先構建一個結構樹
1.document對象
每個載入瀏覽器的HTML文檔都會成為document對象。document對象包含了文檔的基本信息,我們可以通過JavaScript對HTML頁面中的所有元素進行訪問、修改。
document對象具有一些常用的屬性:
-
doctype屬性
在書寫HTML文檔的時候第一句一般都是doctype聲明,可以通過document對象獲取,沒有則返回null;
-
head、body屬性
通過訪問documen的head屬性或者body屬性來獲得文檔樹的head節點,以及body節點,這兩個節點都是包括該元素的字節點的;
-
activeElement屬性
activeElement屬性返回當前文檔中獲得焦點的那個元素。
用戶通??梢允褂胻ab鍵移動焦點,使用空格鍵激活焦點,比如如果焦點在一個鏈接上,此時按一下空格鍵,就會跳轉到該鏈接
-
documentURI、domain、lastModified三個屬性
1.documentURI屬性返回當前文檔的網址
2.domain屬性返回文檔域名
3.lastModified返回當前文檔的最后修改時間
-
location屬性
location屬性返回一個只讀對象,提供了當前文檔的URL信息
-
title、characterSet屬性
- title屬性返回當前文檔的標題,該屬性是可寫的
- characterSet屬性返回渲染當前文檔的字符集
-
readyState
readyState屬性返回當前文檔的狀態,共有三種可能的值
- loading:加載HTML代碼階段,尚未完成解析
- interactive:加載外部資源階段
- complete:全部加載完成
-
compatMode
compatMode屬性返回瀏覽器處理文檔的模式,可能的值為
BackCompat:向后兼容模式,也就是沒有添加DOCTYPE
CSS1Compat:嚴格模式,添加了DOCTYPE
-
cookie
cookie是存儲在客戶端的文本;
-
innerText
innerText是一個可寫屬性,返回元素內包含的文本內容,在多層次的時候會按照元素由淺到深的順序拼接其內容;
以之前構建的文檔樹為例,,返回了id為purchase元素節點下的文本內容.
-
innerHTML、outerHTML屬性
innerHTML屬性作用和innerText類似,但是不是返回元素的文本內容,而是返回元素的HTML結構,在寫入的時候也會自動構建DOM;
outerHTML 返回內容還包括本身;
待補充.......................
2Element對象
除了document對象,在DOM中最常用的就是Element對象了,Element對象表示HTML元素。
DOM提供了一系列的方法可以進行元素的增、刪、改、查操作;
對于元素操作有以下三種常用方法:
- 語法: 對象名.屬性
- 語法: 對象的成員方法
- 語法 對象.className
主要介紹了對象的成員方法的寫法 -
查詢元素
- getElementById()
getElementById方法返回匹配指定ID屬性的元素節點。如果沒有發現匹配的節點,則返回null。這也是獲取一個元素最快的方法
- getElementsByClassName()
getElementsByClassName方法返回一個類似數組的對象(HTMLCollection類型的對象),包括了所有class名字符合指定條件的元素(搜索范圍包括本身),元素的變化實時反映在返回結果中。這個方法不僅可以在document對象上調用,也可以在任何元素節點上調用。
getElementsByClassName方法的參數,可以是多個空格分隔的class名字,返回同時具有這些class節點的元素。
getElementsByClassName方法是新方法,要注意兼容性的問題
- getElementsByTagName()
getElementsByTagName方法返回所有指定標簽的元素(搜索范圍包括本身)。返回值是一個HTMLCollection對象(類似于數組的形式),也就是說,搜索結果是一個動態集合,任何元素的變化都會實時反映在返回的集合中。這個方法不僅可以在document對象上調用,也可以在任何元素節點上調用。
- getElementsByName()
getElementsByName方法用于選擇擁有name屬性的HTML元素,比如form、img、frame、embed和object,返回一個NodeList格式的對象,不會實時反映元素的變化。
以下兩種方法要考慮兼容性的問題
querySelector()
querySelector方法返回匹配指定的CSS選擇器的元素節點。如果有多個節點滿足匹配條件,則返回第一個匹配的節點。如果沒有發現匹配的節點,則返回null。
querySelector方法無法選中CSS偽元素。querySelectorAll()
querySelectorAll方法返回匹配指定的CSS選擇器的所有節點,返回的是NodeList類型的對象。NodeList對象不是動態集合,所以元素節點的變化無法實時反映在返回結果中。-
創建元素
createElement()
createElement方法用來生成HTML元素節點。
createElement方法的參數為元素的標簽名,即元素節點的tagName屬性。如果傳入大寫的標簽名,會被轉為小寫。如果參數帶有尖括號(即<和>)或者是null,會報錯。createTextNode()
createTextNode方法用來生成文本節點,參數為所要生成的文本節點的內容。createDocumentFragment()
createDocumentFragment方法生成一個DocumentFragment對象。
DocumentFragment對象是一個存在于內存的DOM片段,但是不屬于當前文檔,常常用來生成較復雜的DOM結構,然后插入當前文檔。這樣做的好處在于,因為DocumentFragment不屬于當前文檔,對它的任何改動,都不會引發網頁的重新渲染,比直接修改當前文檔的DOM有更好的性能表現。-
修改元素
appendChild()
在元素末尾添加元素insertBefore()
在某個元素之前插入元素replaceChild()
replaceChild()接受兩個參數:要插入的元素和要替換的元素-
刪除元素
刪除元素使用removeChild()方法即可
clone元素
cloneNode()方法用于克隆元素,方法有一個布爾值參數,傳入true的時候會深復制,也就是會復制元素及其子元素(IE還會復制其事件),false的時候只復制元素本身
屬性操作
getAttribute()
getAttribute()用于獲取元素的attribute值createAttribute()
createAttribute()方法生成一個新的屬性對象節點,并返回它。
createAttribute方法的參數name,是屬性的名稱。setAttribute()
setAttribute()方法用于設置元素屬性romoveAttribute()
removeAttribute()用于刪除元素屬性element.attributes
當然上面的方法做的事情也可以通過類操作數組屬性element.attributes來實現
3.1 DOM節點對象的類型
DOM模型將html標簽轉換成JavaScript對象之后,根據標簽的類型不同,也將dom節點對象分了一下類:
- html標簽----轉換成標簽節點:節點名字就是標簽的名字,節點類型是1
- html標簽的屬性---轉換成屬性節點,節點名字就是屬性名字,節點類型是2
- 空白部分、回車換行----轉換成空白節點,節點名字:#text,節點類型是3
3.2 DOM節點關系
DOM文檔對象模型將html文檔轉換成JavaScript對象之后,將標簽之間的層級關系保留到JavaScript節點對象里面了
- 父子關系:
firstChild,父節點下面的第一個子節點
lastChild,父節點下面最后一個子節點
childNodes,父節點下面的所有子節點
parentNode,通過子節點找到父節點 - 兄弟姐妹關系:
previousSibling,前一個同胞節點(哥哥、姐姐)
nextSibling,后一個同胞節點(弟弟、妹妹)
3.3 DOM節點添加、刪除
創建節點對象:
(1) document.createElement();
(2) 確定該節點的位置
- 父節點.appendChild(),父節點追加子節點
- 父節點.insertBefore(),在某個標簽前面插入一個子節點
刪除節點:
父節點.removeChild(子節點)
復習部分
-
題目1: dom對象的innerText和innerHTML有什么區別?
dom對象的innerText和innerHTML屬性一個是輸出元素節點的文本,一個是輸出該節點下的HTML結構,差異可以通過以下實例驗證:
-
題目2: elem.children和elem.childNodes的區別?
elem.children 和elem.childNodes區別在于:
- elem.children主要返回的是當前元素節點的所有子元素節點;
- elem.childNodes主要返回的是當前元素節點的所有子節點(包括元素節點,屬性節點以及文本節點);
-
題目3:查詢元素有幾種常見的方法?ES5的元素選擇方法是什么?
查詢元素有3種常見的方法
element.getElementById()方法
返回匹配指定的ID屬性的元素節點;element.getElementsByClassName()方法
返回HTML collection類型的對象,該對象形式類似于數組,包括了所有class名字符合匹配條件的元素(搜索范圍包括本身),該方法不僅可以在document對象上使用,也可以在任意的元素節點上使用;element.getElementsByTagName()方法
返回所有指定標簽的元素(搜索范圍包括本身),返回值為HTML Collection 對象,該方法不僅在document對象中調用,而且可以在任意的元素節點上調用;element.getElementsByName()方法
該方法用于選擇具有name屬性的HTML元素,返回一個NodeLIst格式的對象,不會實時反映元素的變化;
ES5的元素選擇方法為:
querySelectot()
該方法返回匹配指定的css選擇器的元素節點,如果有多個元素節點滿足條件,則返回匹配到的第一個元素節點;querySelectorAll()
該方法返回匹配指定的css選擇器的所有節點,返回的是NodeList類型的對象;-
題目4:如何創建一個元素?如何給元素設置屬性?如何刪除屬性
創建元素: 通過createElement()方法來生成HTML元素節點;
設置屬性: 通過setAttribute()方法用于設置元素屬性;
刪除屬性: 通過removeAttribute()方法來刪除元素屬性;
-
題目5:如何給頁面元素添加子元素?如何刪除頁面元素下的子元素?
通過元素的appendChild()方法給元素添加子元素,添加到元素末尾。
通過元素的removeChild()方法刪除元素的子元素。
-
題目6: element.classList有哪些方法?如何判斷一個元素的 class 列表中是包含某個 class?如何添加一個class?如何刪除一個class?
- add( String [, String] ) 添加指定的類值。如果這些類已經存在于元素的屬性中,那么它們將被忽略。
remove( String [,String] ) 刪除指定的類值。
item ( Number )按集合中的索引返回class值。
toggle ( String [, force] ) 當只有一個參數時:切換 class value; 即如果類存在,則刪除它并返回false,如果不存在,則添加它并返回true。
當存在第二個參數時:如果第二個參數的計算結果為true,則添加指定的類值,如果計算結果為false,則刪除它contains( String ) 檢查元素的類屬性中是否存在指定的類值。
-
使用contains方法判斷一個元素的class中是否包含某個class。add添加一個class,remove刪除一個class。
<script> //添加class var elem = document.getElementById('purchases'); elem.classList.add('title','name','test'); console.log(elem.classList); //刪除class elem.classList.remove('name'); console.log(elem.classList); //按索引返回類值 var res = elem.classList.item(0); console.log(res); //toggle ( String [, force] ) 當存在第二個參數時:如果第二個參數的計算結果為true,則添加指定的類值,如果計算結果為false,則刪除它 elem.classList.toggle('ccc',true); console.log(elem.classList); //用contain方法來檢查元素中是否有指定的類值 var res = elem.classList.contains('ccc'); console.log(res); </script>
-
題目7: 如何選中如下代碼所有的li元素? 如何選中btn元素?
<script>
//選中所有的li元素
var list = document.getElementsByTagName('li');
console.log(list);
var list = document.querySelectorAll('li');
console.log(list);
//選中btn元素
var elem = document.getElementsByClassName('btn');
console.log(elem);
var elem = document.querySelectorAll('.btn');
console.log(elem);
</script>