1.事件流:描述從頁面接收事件的順序。IE提出冒泡流,Netscape提出捕獲流。
1.1 事件冒泡
事件開始時由最具體的元素(嵌套最深)接收,然后逐級向上傳播到最外層節(jié)點(文檔)。
1.2 事件捕獲
從最外層不太具體的節(jié)點收到事件,傳遞給最內(nèi)層的具體的節(jié)點。
1.3.DOM事件流
事件捕獲階段、目標(biāo)階段、事件冒泡階段
捕獲階段:事件從ducument->html->body
目標(biāo)階段:事件在div上發(fā)生。在事件處理中被看成冒泡階段的一部分。
冒泡階段:事件傳回document
2.事件處理
2.1.HTML事件處理
指定onclick屬性:
缺點:時差問題、擴(kuò)展事件處理程序的作用域鏈在不同瀏覽器有不同結(jié)果、HTML和JavaScript代碼耦合。
摒棄此種方法,使用JavaScript指定時間處理程序。
2.2.DOM0級事件處理
使用DOM0級方法指定的事件處理程序被認(rèn)為是元素的方法,這時候事件處理程序時在元素作用域中運行,程序中this引用當(dāng)前元素。
2.3.DOM2級事件處理
定義了兩個方法:添加事件addEventListener() 刪除事件 removeEventListener()
接收三個參數(shù):要處理的事件名、作為事件處理的函數(shù)、布爾值。
布爾值為true,表示在捕獲階段調(diào)用事件處理
布爾值為false,表示在冒泡階段調(diào)用時間處理
使用addEventListener()添加的事件處理程序,只能用removeEventListener()移除,移除的參數(shù)與添加參數(shù)相同,通過addEventListener()添加的匿名函數(shù)將無法移除。
重寫之后可以移除
可用的瀏覽器:
2.4.IE9之前版本事件處理
IE實現(xiàn)和DOM2事件處理類似的兩個方法
attachEvent()和detachEvent()。
接收兩個參數(shù):事件名稱,事件處理函數(shù)。IE8及之前版本只支持事件冒泡,所以不需要第三個參數(shù)。
注意:在IE中使用attachEvent()的作用域是全局作用域,this等于window。
使用attachEvent()添加的事件,只能使用detachEvent()來移除,同樣參數(shù)必須相同。
2.5.跨瀏覽器的事件處理
定義了兩個方法addHandler和removeHandler()
接收三個參數(shù),元素,事件類型,事件處理方法。
首先判斷有沒有DOM2的方法
沒有再判斷有沒有IE的方法
沒有就使用DOM1,這里直接給元素添加了屬性。
3.事件對象
3.1 DOM中的事件對象
兼容DOM的瀏覽器都會將event對象傳入到事件處理程序中。
在需要一個函數(shù)處理多個事件時,可以使用type屬性。
-
阻止特定事件的默認(rèn)行為
-
停止事件在DOM層次的傳播,只會彈出一次警告框,body上的被禁止傳播。
-
事件對象的eventPhase屬性:確定當(dāng)前事件位于事件流的那個階段。捕獲1,目標(biāo)處理2,冒泡3。
3.2 IE中的事件對象
訪問IE中的event對象有幾種不同的方式,取決于指定事件處理程序的方法。
i)DOM0級方法添加事件處理程序
event對象作為window屬性存在
ii)DOM2,使用attachEvent(),就會有一個event對象作為參數(shù)被傳入事件處理函數(shù)。
-
取消給定事件的默認(rèn)行為,與DOM中preventDefault()方法作用相同。
-
停止事件冒泡,與DOM中stopPropagation()方法作用相同。
3.3 跨瀏覽器事件對象
4 事件類型
4.1 UI事件
-
load事件
當(dāng)頁面完全加載后在window上出發(fā),當(dāng)體香加載完在img元素上觸發(fā)。
i)window上的事件有如下兩種方式:
ii)img的load事件
-
unload事件
文檔完全被卸載時觸發(fā)。用戶從一個頁面切換到另一個頁面會觸發(fā)。
-
resize事件
當(dāng)瀏覽器窗口被調(diào)整到一個新的高度或?qū)挾葧r,會觸發(fā)resize事件。
-
scroll事件
以上代碼輸出頁面垂直滾動位置
4.2 焦點事件
會在頁面獲得或失去焦點時觸發(fā)。
4.3 鼠標(biāo)與滾輪事件
-
客戶區(qū)坐標(biāo)位置
相對于瀏覽器窗口的位置:clientX,clientY
-
頁面坐標(biāo)位置
判斷在頁面中的位置,從頁面本身而非視口的左邊和頂邊計算的。pageX,pageY。沒有滾動時與clientX,clientY相等。
-
屏幕坐標(biāo)位置
相對于整個電腦屏幕的位置:screenX,screenY
-
四個修改鍵
4.4 鍵盤與文本事件
三個鍵盤事件
1)鍵碼
發(fā)生keydown和keyup事件時,event對象的keyCode屬性會包含一個代碼,與鍵盤上一個特定的鍵對應(yīng)。
2)字符編碼
如果按下的是字符,使用charCode屬性獲取值。
3)textInput事件
用戶在可編輯區(qū)輸入字符時,觸發(fā)該事件。
用戶按上檔鍵和s,data值為S
沒有按上檔鍵,data值為s
5.內(nèi)存和性能
5.1事件委托
對于事件處理程序過多的問題解決方案就是事件委托,利用事件冒泡,只指定一個事件處理程序,就可以管理某一類型的所有事件。
要給所有的li添加事件,只需要為ul添加一個事件。