Javascript DOM Event物件方法詳解
Event 物件代表事件的狀態,比如事件在其中發生的元素、鍵盤按鍵的狀態、滑鼠的位置、滑鼠按鈕的狀態。事件通常與函式結合使用,函式不會在事件發生前被執行!
事件分為三個階段: 事件捕獲 --> 事件目標 --> 事件冒泡
事件捕獲:事件發生時(onclick,onmouseover……)首先發生在document上,然後依次傳遞給body......最後到達目的節點(即事件目標)。
事件冒泡:事件到達事件目標之後不會結束,會逐層向上冒泡,直至document物件,跟事件捕獲相反
1、事件控制代碼 (Event Handlers)
HTML4.0的新特性之一是能夠使HTML事件觸發瀏覽器中的行為,比如當用戶點選某個HTML元素時啟動一段JavaScript。下面是一個屬性列表,可將之插入 HTML 標籤以定義事件的行為。
|
2、滑鼠 / 鍵盤屬性
屬性 | 描述 |
---|---|
返回當事件被觸發時,"ALT" 是否被按下。 | |
返回當事件被觸發時,哪個滑鼠按鈕被點選。 | |
返回當事件被觸發時,滑鼠指標的水平座標。 | |
返回當事件被觸發時,滑鼠指標的垂直座標。 | |
返回當事件被觸發時,"CTRL" 鍵是否被按下。 | |
返回當事件被觸發時,"meta" 鍵是否被按下。 | |
返回當某個事件被觸發時,滑鼠指標的水平座標。 | |
返回當某個事件被觸發時,滑鼠指標的垂直座標。 | |
返回當事件被觸發時,"SHIFT" 鍵是否被按下。 |
button值
引數 | 描述 |
---|---|
0 | 規定滑鼠左鍵。 |
1 | 規定滑鼠中鍵。 |
2 | 規定滑鼠右鍵。 |
IE瀏覽器擁有不同的引數:
引數 | 描述 |
---|---|
1 | 規定滑鼠左鍵。 |
4 | 規定滑鼠中鍵。 |
2 | 規定滑鼠右鍵。 |
3、IE 屬性
除了上面的滑鼠/事件屬性,IE 瀏覽器還支援下面的屬性:
屬性 | 描述 |
---|---|
cancelBubble | 如果事件控制代碼想阻止事件傳播到包容物件,必須把該屬性設為 true。 |
fromElement | 對於 mouseover 和 mouseout 事件,fromElement 引用移出滑鼠的元素。 |
keyCode | 對於 keypress 事件,該屬性聲明瞭被敲擊的鍵生成的 Unicode 字元碼。對於 keydown 和 keyup 事件,它指定了被敲擊的鍵的虛擬鍵盤碼。虛擬鍵盤碼可能和使用的鍵盤的佈局相關。 |
offsetX,offsetY | 發生事件的地點在事件源元素的座標系統中的 x 座標和 y 座標。 |
returnValue | 如果設定了該屬性,它的值比事件控制代碼的返回值優先順序高。把這個屬性設定為 fasle,可以取消發生事件的源元素的預設動作。 |
srcElement | 對於生成事件的 Window 物件、Document 物件或 Element 物件的引用。 |
toElement | 對於 mouseover 和 mouseout 事件,該屬性引用移入滑鼠的元素。 |
x,y | 事件發生的位置的 x 座標和 y 座標,它們相對於用CSS動態定位的最內層包容元素。 |
4、標準 Event 屬性
下面列出了 2 級 DOM 事件標準定義的屬性:
屬性 | 描述 |
---|---|
返回布林值,指示事件是否是起泡事件型別。 | |
返回布林值,指示事件是否可擁可取消的預設動作。 | |
返回觸發此事件的元素(事件的目標節點)。 | |
type | 返回當前 Event 物件表示的事件的名稱。 |
5、標準 Event 方法
下面列出了 2 級 DOM 事件標準定義的方法。IE 的事件模型不支援這些方法:
6、IE相容相關
6.1 註冊與移除事件監聽器
1)addEventListener(event.type, handle, boolean);IE8及以下不支援,屬於DOM2級的方法,可新增多個方法不被覆蓋
//事件型別沒有on,false 表示在事件第三階段(冒泡)觸發,true表示在事件第一階段(捕獲)觸發。 如果handle是同一個方法,只執行一次。 ele.addEventListener('click', function(){ }, false); //解綁事件,引數和繫結一樣 ele.removeEventListener(event.type, handle, boolean);
2)attachEvent(event.type, handle ); IE特有,相容IE8及以下,可新增多個事件處理程式,只支援冒泡階段
//如果handle是同一個方法,繫結幾次執行幾次,這點和addEventListener不同,事件型別要加on,例如onclick而不是click ele.attachEvent('onclick', function(){ }); //解綁事件,引數和繫結一樣 ele.detachEvent("onclick", function(){ });
3)接下來我們把事件繫結以及事件解綁封裝成為一個函式,相容瀏覽器,包括IE6及以上
// 事件繫結 function addEvent(element, eType, handle, bol) { if(element.addEventListener){ //如果支援addEventListener element.addEventListener(eType, handle, bol); }else if(element.attachEvent){ //如果支援attachEvent element.attachEvent("on"+eType, handle); }else{ //否則使用相容的onclick繫結 element["on"+eType] = handle; } }
// 事件解綁 function removeEvent(element, eType, handle, bol) { if(element.addEventListener){ element.removeEventListener(eType, handle, bol); }else if(element.attachEvent){ element.detachEvent("on"+eType, handle); }else{ element["on"+eType] = null; } }
6.2 阻止事件傳遞後的預設處理
1)event.preventDefault( ); 阻止通過 addEventListener( )新增的事件的預設事件(DOM標準)
element.addEventListener("click", function(e){ var event = e || window.event; …… event.preventDefault( ); //阻止預設事件 },false);
2)event.returnValue = false; 阻止通過 attachEvent( ) 新增的事件的預設事件(IE)
element.attachEvent("onclick", function(e){ var event = e || window.event; …… event.returnValue = false; //阻止預設事件 },false);
6.3 取消瀏覽器的事件傳遞