1. 文檔對象模型,Document Object Model
DOM是針對HTML和XML文檔的一個API(應用程序編程接口),DOM描繪了一個層次化的節點樹,允許開發人員添加,移除,修改頁面的某一部分。1998年10月DOM1級規範成爲W3C的推薦標準,爲基本的文檔結構以及查詢提供了接口。但是要注意,IE中的所有DOM對象都是以COM對象的形式實現的。這意味着IE中的DOM對象與原生JavaScript對象的行爲或活動特點並不一致。
DOM可以將任何HTML或XML文檔描繪成一個由多層節點構成的結構。節點分爲幾種不同的類型,每種類型分別表示文檔中不同的信息或標記。每個節點擁有各自的特點,數據和方法,另外也有與其他節點存在某種關係。節點之間的關係構成了層次,所有頁面標記則表現爲一個以特定節點爲根節點的樹形結構。
1) Node類型
DOM1級定義爲一個Node接口,該接口將由DOM中的所有節點類型實現。除了IE之外,在其他所有瀏覽器中都可以訪問到這個類型。javascript中所有的節點類型都繼承自Node類型,所有節點類型都共享着相同的基本屬性和方法。
1. 節點關係
屬性:
nodeType
表示節點類型
Element 1;TextNode 3;Comment 8;Document 9
document 是Document構造函數的實例
document.body是Element構造函數的實例
document.body.firstChild 是Comment構造函數的實例
nodeName
該屬性取決於節點類型,如果是元素類型,值爲元素的標籤名
nodeValue
該屬性取決於節點類型,如果是元素類型,值有null
childNodes
屬性,保存一個NodeList對象,NodeList是一種類數組對象用來保存一組有序的節點,NodeList是基於DOM結構動態執行查詢的結果,DOM結構變化可以自動反應到NodeList對象中。訪問時可以通過 [ ] 中括號訪問,也可以通過item()方法訪問。可以使用slice方法將NodeList轉換爲數組
var arr = Array.prototype.slice.call(nodes,0);
parentNode 父親
指向文檔樹中的父節點。包含在childNodes列表中所有的節點都具有相同的父節點,每個節點之間都是同胞/兄弟節點。
previousSibling 哥哥/姐姐
兄弟節點中的前一個節點
nextSibling 弟弟/妹妹
兄弟節點中的下一個節點
firstChild
childNodes列表中的第一個節點
lastChild
childNodes列表中的最後一個節點
ownerDocument
指向表示整個文檔的文檔節點。任何節點都屬於它所在的文檔,任何節點都不能同時存在於兩個或更多個文檔中。
方法:
hasChildNodes() 檢測是否有孩子節點
在包含一個或多個子節點的情況下返回true
2. 操作節點
以下四個方法都需要父節點對象進行調用!
appendChild()
向childNodes列表末尾添加一個節點。返回新增的節點。關係更新如果參數節點已經爲文檔的一部分,位置更新而不插入,dom樹可以看做是由一系列的指針連接起來的,任何DOM節點不能同時出現在文檔中的多個位置。
insertBefore()
第一個參數:要插入的節點;
第二個參數:作爲參照的節點;
被插入的節點會變成參照節點的前一個同胞節點,同時被方法返回。如果第二個參數爲null將會將該節點追加在NodeList後面
replaceChild()
第一個參數:要插入的節點;
第二個參數:要替換的節點;
要替換的節點將由這個方法返回並從文檔樹中被移除,同時由要插入的節點佔據其位置。
removeChild()
一個參數,即要移除的節點。
移除的節點將作爲方法的返回值。
其他方法,任何節點對象都可以調用。
其他方法
cloneNode()
用於創建調用這個方法的節點的一個完全相同的副本。有一個參數爲布爾類型參數爲true時,表示深複製,即複製節點以及整個子節點數。參數爲false的時候,表示淺複製,只複製節點本身。該方法不會複製添加到DOM節點中的JavaScript屬性,例如事件處理程序等。該方法只複製特定,子節點,其他一切都不復制。但是IE中可以複製,建議標準相同,在複製之前,移除所有事件處理程序。
normalize()
處理文檔樹中的文本節點,由於解析器的實現或DOM操作等原因,可能會出現文本節點不包含文本,或者接連出現兩個文本節點,當在某個節點上調用了該方法,會刪除空白節點,會找到相鄰的兩個文本節點,並將他們合併爲一個文本節點。
2) Document類型
javascript通過使用Document類型表示文檔。在瀏覽器中,document對象是HTMLDocument的一個實例,表示整個HTML頁面。document對象是window對象的一個屬性,因此可以直接調用。HTMLDocument繼承自Document
1. 文檔子節點
可以繼承Node中所有的屬性和方法
屬性:
documentElement 始終指向HTML頁面中的<html>元素。
body 直接指向<body>元素
doctype 訪問<!DOCTYPE>, 瀏覽器支持不一致,很少使用
title 獲取文檔的標題
URL 取得完整的URL
domain 取得域名,並且可以進行設置,在跨域訪問中經常會用到。
referrer 取得鏈接到當前頁面的那個頁面的URL,即來源頁面的URL
images 獲取所有的img對象,返回HTMLCollection類數組對象
forms 獲取所有的form對象,返回HTMLCollection類數組對象
links 獲取文檔中所有帶href屬性的<a>元素
2. 查找元素
getElementById()
參數爲要取得元素的ID,如果找到返回該元素,否則返回null如果頁面中多個元素的ID值相同,只返回文檔中第一次出現的元素。如果某個表單元素的name值等於指定的ID,該元素也會被匹配。
getElementsByTagName()
參數爲要取得元素的標籤名,返回包含另個或者多個元素的NodeList,在HTML文檔中該方法返回的是HTMLCollection對象,與NodeList非常類似。可以通過[index/name],item(),namedItem(name)訪問
getElementsByName()
參數爲元素的name,返回符合條件的HTMLCollection
getElementsByClassName()
參數爲一個字符串,可以由多個空格隔開的標識符組成。當元素的class屬性值包含所有指定的標識符時才匹配。HTML元素的class屬性值是一個以空格隔開的列表,可以爲空或包含多個標識符。
3) Element類型
1. HTML元素
所有的HTML元素都由HTMLElement類型表示,或者其子類型表示。每個HTML元素都應具有如下一些屬性以及html元素特有的屬性。
id 元素在文檔中的唯一標識符
title 有關元素的附加說明信息
className 與元素class特性對應
src img元素具有的屬性
alt img元素具有的屬性
lang 元素內容的語言代碼,很少使用!
dir 語言方向,ltr,rtl 左到右,右到左、
可以通過屬性訪問到該屬性對應的值
1)取得屬性
getAttribute() 參數爲實際元素的屬性名,calss,name,id,title,lang,dir一般只有在取得自定義特性值的情況下,纔會用該方法大多數直接使用屬性進行訪問,比如style,onclick
2)設置屬性
setAttribute() 兩個參數,第一個參數爲要設置的特性名,第二個參數爲對應的值。如果該值存在,替換。
3)移除屬性
removeAttribute() 移除指定的特姓
4)attributes屬性,其中包含了一個NamedNodeMap,與NodeList類似。
getNamedItem(name)
removeNamedItem(name) 從列表中刪除nodeName屬性等於name的值
setNamedItem(node) 向列表中添加一個節點
item(pos) 返回位於數字pos位置處的節點
5)創建元素
createElement() 一個參數,要創建元素的標籤名。
6)元素的子節點
<ul>
<li>item1</li>
<li>item2</li>
<li>item3</li>
</ul>
ie8及一下版本瀏覽器 3個子節點
其他瀏覽器 7個子節點
2. 作爲文檔樹的文檔
將文檔看做是Element對象樹,忽略文檔Text,Comment節點。Element中的屬性
children :類似於childNodes,返回NodeList對象,但是該對象中僅包含Element對象
firstElementChild :第一個孩子元素節點
lastElementChild :最後一個孩子元素節點
nextElementSibling :下一個兄弟元素節點
previousElementSibling :上一個兄弟元素節點
childElementCount :子元素的數量,返回值和children.length值相等
3. 元素內容
innerHTML 返回元素內容+html結構
textContent 非ie瀏覽器 只拿文本節點
innerText ie瀏覽器
insertAjacentHTML()
第一個參數爲位置(beforebegin,afterbegin,beforeend,afterend),
第二個參數爲內容
<div id="target">this is element html</div>
beforebegin afterbegin beforeend afterend
4) Text類型: 文本類型
文本節點。包含的是可以按照字面解釋的存文本內容。
length
文本長度
appendData(text)
追加文本
deleteData(beginIndex,count)
刪除文本
insertData(beginIndex,text)
插入文本
replaceData(beginIndex,count,text)
替換文本
splitText(beiginIndex)
從beginIndex位置將當前文本節點分成兩個文本節點
substringData(beiginIndex,count)
從beginIndex開始提取count個子字符串
<span>這個是文本節點</span>
document.createTextNode()
創建文本節點,參數爲要插入節點中的文本
5) Comment類型: 註釋類型
<div id = "myDiv"><!--a comment--></div>
<!--a comment--> Comment類型
2. 事件
javascript與HTML之間的交互是通過事件實現的。事件就是文檔或瀏覽器窗口中發生的一些特定的交互瞬間。
事件三要素:
事件目標(event target)
發生的事件與之相關聯或與之相關的對象
事件處理程序(event handler)
處理或相應事件的函數
事件對象(event object)
與特定事件相關且包含有關該事件詳細信息的對象。
1) 事件流
描述的是從頁面中接受事件的順序
1. 事件冒泡
事件開始由最具體的元素接收,然後逐級向上傳播到不具體的節點。
<html>
<head></head>
<body>
<div>click me</div>
</body>
</html>
當點擊了<div>元素,這個click事件會按照如下順序傳播
div->body->html->document
注意:IE8以及更早版本只支持事件冒泡。
2. 事件捕獲
不太具體的節點更早接收事件,具體的節點到最後接收事件。當點擊了<div>元素,按照如下方式觸發click事件
document->html->body->div
3. dom事件流
“DOM2級事件”規定了事件流包括三個階段:事件捕獲階段,處理目標階段和事件冒泡階段。
事件捕獲: document->html->body
處理目標: 事件處理
事件冒泡: div->body->html->document
2) 事件處理程序
事件就是用戶或瀏覽器自身執行的某種動作,響應某個事件的函數爲事件處理程序,事件處理程序以"on"開頭(onclick,onload)
1. HTML事件處理程序
<input type="button" value="clickMe" onclick = "alert('is clicked')">
不能在事件中使用未經轉義的HTML語法字符
<input type="button" value="clickMe" onclick = "showMsg()">
<script type="text/javascript">
function showMsg(){
alert("is clicked");
}
</script>
點擊按鈕會調用showMsg()函數,事件處理程序的代碼在執行時,有權訪問全局作用域的任何代碼。
2. DOM0級事件處理程序
通過javascript制定時間事件程序的傳統方式,將一個函數賦值給一個事件處理程序屬性。特點是簡單,跨瀏覽器。
var btn = document.getElementById("btn");
btn.onclick = function(){
alert('cliked');
}
dom0級方法制定的事件處理程序被認爲是元素的方法,因此這個時候時間處理程序是在元素的作用域中運行,this指向當前元素。
btn.onclick = null; //刪除事件處理程序
3. DOM2級事件處理程序 非IE 下
addEventListener()
事件綁定
參數:
要綁定的事件名
作爲事件處理的函數
布爾值:true在捕獲階段調用事件處理程序;false在冒泡階段調用
removeEventListener()
事件刪除
參數:
要刪除的事件名
作爲事件處理的函數
布爾值:true在捕獲階段調用事件處理程序;false在冒泡階段調用
例如:
//事件綁定
var btn = document.getElementById("btn");
btn.addEventListener("click",function(){
alert(this.id); //該函數在其依附的元素的作用域中運行。
},false);
//事件移除
var btn = document.getElementById("btn");
var handler = function(){
alert(this.id);
}
btn.addEventListener("click",handler,false);
btn.removeEventListener("click",handler,false);//移除
可以添加多個事件處理程序,並且按照添加她們的順序觸發。移除事件傳入的參數與添加處理程序時使用的參數相同,添加事件時如果使用匿名函數將無法刪除
4. IE事件處理程序
事件處理程序會在全局作用域中運行,因此this指向window對象。爲一個對象添加兩個相同的事件,事件處理程序的順序是按照添加相反順序進行處理
attachEvent() 非IE
事件綁定
參數:
時間處理程序名稱
時間處理函數
detachEvent()
事件移除
參數:
時間處理程序名稱
時間處理函數
事件處理程序都被添加到冒泡階段
5. 跨瀏覽器的事件處理程序
見代碼 lib.js
3) 事件對象
1. dom中的事件對象
在觸發DOM上的某個事件時,會產生一個事件對象event,這個對象包含着所有與事件相關的信息,默認會將event對象傳入到事件處理函數中
dom.onclick = function(event){
console.log(event);
}
dom.addEventListener("click",function(event){
console.log(event);
},false);
屬性 類型 說明
bubbles Boolean 事件是否冒泡
cancelable Boolean 是否可以取消事件默認行爲
currentTarget Element 當前正在處理事件的那個元素
eventPhase Integer 調用事件處理程序的階段;1,捕獲 2,處於目標 3,冒泡
target Element 事件目標
type String 事件類型
trusted Boolean 事件是否是瀏覽器生成的
preventDefault() Function 取消事件的默認行爲
stopPropagation() Function 取消事件的進一步捕獲或者冒泡
在事件處理程序內部,對象this始終等於currentTarget值,而target則只包含事件的實際目標。如果直接將事件處理程序指定給了目標元素,this,currentTarget,target包含相同的值。
2. IE中的事件對象
event可以作爲window對象的一個屬性存在,使用attachEvent添加事件處理程序的時候,event對象會作爲參數傳入事件處理函數中
dom.onclick = function(){
console.log(window.event);
window.event.returnValue = false;//阻止默認行爲
window.event.cancalBubble = true;//取消冒泡
}
dom.attachEvent("onclick",function(event){
console.log(window.event);
});
屬性 類型 說明
cancelBubble Boolean 是否取消時間冒泡,值爲true取消冒泡 stopPropagation()
returnValue Boolean 取消時間默認行爲,值爲false阻止 preventDefault()
srcEvent Element 時間的目標 target
type String 被觸發的時間 的類型
3. 跨瀏覽器的事件對象
事件對象
目標對象
阻止默認行爲
阻止冒泡
4) 事件類型
1. UI事件
load
當頁面完全加載後再window上觸發,當所有框架加載完畢時在框架集上觸發,當圖像加載完畢時在img元素上觸發,當嵌入的內容加載完時在<object>觸發
unload
當頁面完全卸載後再window上觸發,當所有框架都卸載後在框架集上觸發,當嵌入的內容卸載完畢後再<object>上觸發,(firefox不支持)
select
當用戶選擇文本框(<input>,<textarea>)中的一個或多個字符時
resize
當瀏覽器窗口被調整到一個新的高度或者寬度時,會觸發
scroll
當用戶滾動帶滾動條的元素中的內容時,在該元素上觸發resize,scroll會在變化期間重複被激發,儘量保持代碼簡單
2. 焦點事件
blur
元素失去焦點的時候觸發
focus
元素獲得焦點的時候觸發,不支持冒泡
//IE支持
focusin
與focus等價,支持冒泡
focusout
與blur等價,支持冒泡
3. 鼠標與滾輪事件
click
點擊主鼠標按鈕或者按下回車按鍵的時候觸發。只有在一個元素上相繼發生mousedown,mouseup事件,纔會觸發click事件
dblclick
雙擊主鼠標按鈕時觸發.只有在一個元素上相繼觸發兩次click時間纔會觸發dbclick事件
mousedown
任意鼠標按鈕按下時觸發
mouseup
釋放鼠標按鈕觸發
mousemove
鼠標在元素內部移動的時候重複觸發
mousewheel
滾輪事件
mouseover
鼠標位於元素外部,將其首次移入另一個元素邊界之內時觸發【支持子元素】
mouseenter
鼠標光標從元素外部首次移動到元素範圍內激發,不冒泡。【不支持子元素】
mouseout
在位於元素上方的鼠標光標移入到另外一個元素中。【支持子元素】在被選元素上與mouseleave效果相同
mouseleave
在位於元素上方的鼠標光標移動到元素範圍之外時觸發,不冒泡【不支持子元素】
4. 相關元素,event特殊屬性
1.客戶區座標位置
clientX,clientY 事件發生時,鼠標指針在視口中的水平和垂直座標
2.頁面座標位置
pageX,pageY 事件發生時,鼠標指針在頁面本身而非視口的座標,頁面沒有滾動的時候,pageX和pageY的值與clientX和clientY值相等
3.屏幕位置
screenX,screenY
4.修改鍵
值爲boolean類型,用來判斷對應的按鍵是否被按下
shiftKey
ctrlKey
altKey
metaKey
5.鼠標按鈕
mousedown,mouseup,該事件的event對象中包含了button屬性,表示按下或釋放的按鈕。
0表示主鼠標按鈕
1表示中間的滾動按鈕
2表示次鼠標按鈕
5. 鍵盤與文本事件
keydown 按下鍵盤任意鍵時觸發,如果按住不放會重複觸發此事件
keypress 按下鍵盤字符鍵時觸發,如果按住不放會重複觸發此事件
keyup 釋放鍵盤上鍵時觸發
當鍵盤事件發生時,event對象的keyCode屬性中會包含一個代碼與鍵盤上的特定鍵對應,對數字字母鍵,keyCode屬性的值與ASCII碼中對應的小寫字母和數字編碼相同
詳見keycode.txt
1-DOM筆記(詳細)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
4-DOM中重寫-myslice-切割數組
娶个村姑当大妾
2020-06-21 17:02:42
3-DOM操作節點-insertBefore+replaceChild+removeChild
娶个村姑当大妾
2020-02-21 00:31:56
4-DOM中重寫-myslice-切割數組
娶个村姑当大妾
2020-06-21 17:02:42
3-DOM操作節點-insertBefore+replaceChild+removeChild
娶个村姑当大妾
2020-02-21 00:31:56
1-DOM對象模型+事件(+note)
娶个村姑当大妾
2018-09-03 16:56:43
Dom當中對於IE和非IE下事件的封裝
娶个村姑当大妾
2018-09-03 16:56:43