1. 程式人生 > >Javascript DOM Event物件方法詳解

Javascript DOM Event物件方法詳解

  Event 物件代表事件的狀態,比如事件在其中發生的元素、鍵盤按鍵的狀態、滑鼠的位置、滑鼠按鈕的狀態。事件通常與函式結合使用,函式不會在事件發生前被執行!

事件分為三個階段:   事件捕獲 -->  事件目標 -->  事件冒泡 
事件捕獲:事件發生時(onclick,onmouseover……)首先發生在document上,然後依次傳遞給body......最後到達目的節點(即事件目標)。
事件冒泡:事件到達事件目標之後不會結束,會逐層向上冒泡,直至document物件,跟事件捕獲相反


1、事件控制代碼 (Event Handlers)
  HTML4.0的新特性之一是能夠使HTML事件觸發瀏覽器中的行為,比如當用戶點選某個HTML元素時啟動一段JavaScript。下面是一個屬性列表,可將之插入 HTML 標籤以定義事件的行為。

事件 瀏覽器支援 解說
一般事件
onclick IE3、N2 滑鼠點選時觸發此事件
ondblclick IE4、N4 滑鼠雙擊時觸發此事件
onmousedown IE4、N4 按下滑鼠時觸發此事件
onmouseup IE4、N4 滑鼠按下後鬆開滑鼠時觸發此事件
onmouseover IE3、N2 當滑鼠移動到某物件範圍的上方時觸發此事件
onmousemove IE4、N4 滑鼠移動時觸發此事件
onmouseout IE4、N3 當滑鼠離開某物件範圍時觸發此事件
onkeypress IE4、N4 當鍵盤上的某個鍵被按下並且釋放時觸發此事件.
onkeydown IE4、N4 當鍵盤上某個按鍵被按下時觸發此事件
onkeyup IE4、N4 當鍵盤上某個按鍵被按放開時觸發此事件
頁面相關事件
onabort IE4、N3 圖片在下載時被使用者中斷
onbeforeunload IE4、N 當前頁面的內容將要被改變時觸發此事件
onerror IE4、N3 出現錯誤時觸發此事件
onload IE3、N2 頁面內容完成時觸發此事件
onmove IE、N4 瀏覽器的視窗被移動時觸發此事件
onresize IE4、N4 當瀏覽器的視窗大小被改變時觸發此事件
onscroll IE4、N 瀏覽器的滾動條位置發生變化時觸發此事件
onstop IE5、N 瀏覽器的停止按鈕被按下時觸發此事件或者正在下載的檔案被中斷
onunload IE3、N2 當前頁面將被改變時觸發此事件
表單相關事件
onblur IE3、N2 當前元素失去焦點時觸發此事件
onchange IE3、N2 當前元素失去焦點並且元素的內容發生改變而觸發此事件
onfocus IE3 、N2 當某個元素獲得焦點時觸發此事件
onreset IE4 、N3 當表單中RESET的屬性被激發時觸發此事件(函式名前加return)
onsubmit IE3 、N2 一個表單被遞交時觸發此事件 (函式名前加return)
滾動字幕事件
onbounce IE4、N 在Marquee內的內容移動至Marquee顯示範圍之外時觸發此事件(behavior標記為aloernate時才有效
onfinish IE4、N 當Marquee元素完成需要顯示的內容後觸發此事件
onstart IE4、 N 當Marquee元素開始顯示內容時觸發此事件
編輯事件
onbeforecopy IE5、N 當頁面當前的被選擇內容將要複製到瀏覽者系統的剪貼簿前觸發此事件(函式名前加return)
onbeforecut IE5、 N 當頁面中的一部分或者全部的內容將被移離當前頁面[剪貼]並移動到瀏覽者的系統剪貼簿時觸發此事件(函式名前加return)
onbeforeeditfocus IE5、N 當前元素將要進入編輯狀態
onbeforepaste IE5、 N 內容將要從瀏覽者的系統剪貼簿傳送[貼上]到頁面中時觸發此事件(返回true或false是無效的 使用clipboardData等)
onbeforeupdate IE5、 N 當瀏覽者貼上系統剪貼簿中的內容時通知目標物件
oncontextmenu IE5、N 當瀏覽者按下滑鼠右鍵出現選單時或者通過鍵盤的按鍵觸發頁面選單時觸發的事件(函式名前加return)
oncopy IE5、N 當頁面當前的被選擇內容被複制後觸發此事件(函式名前加return)
oncut IE5、N 當頁面當前的被選擇內容被剪下時觸發此事件(函式名前加return)
ondrag IE5、N 當某個物件被拖動時觸發此事件 [活動事件]
ondragdrop IE、N4 一個外部物件被滑鼠拖進當前視窗或者幀
ondragend IE5、N 當滑鼠拖動結束時觸發此事件,即滑鼠的按鈕被釋放了
ondragenter IE5、N 當物件被滑鼠拖動的物件進入其容器範圍內時觸發此事件
ondragleave IE5、N 當物件被滑鼠拖動的物件離開其容器範圍內時觸發此事件
ondragover IE5、N 當某被拖動的物件在另一物件容器範圍內拖動時觸發此事件
ondragstart IE4、N 當某物件將被拖動時觸發此事件
ondrop IE5、N 在一個拖動過程中,釋放滑鼠鍵時觸發此事件
onlosecapture IE5、N 當元素失去滑鼠移動所形成的選擇焦點時觸發此事件
onpaste IE5、N 當內容被貼上時觸發此事件(函式名前加return)
onselect IE4、N 當文字內容被選擇時的事件(函式名前加return)
onselectstart IE4、N 當文字內容選擇將開始發生時觸發的事件(函式名前加return)
資料繫結
onafterupdate IE4、N 當資料完成由資料來源到物件的傳送時觸發此事件
oncellchange IE5、N 當資料來源發生變化時
ondataavailable IE4、N 當資料接收完成時觸發事件
ondatasetchanged IE4、N 資料在資料來源發生變化時觸發的事件
ondatasetcomplete IE4、N 當來子資料來源的全部有效資料讀取完畢時觸發此事件
onerrorupdate IE4、N 當使用onBeforeUpdate事件觸發取消了資料傳送時,代替onAfterUpdate事件
onrowenter IE5、N 當前資料來源的資料發生變化並且有新的有效資料時觸發的事件
onrowexit IE5、N 當前資料來源的資料將要發生變化時觸發的事件
onrowsdelete IE5、N 當前資料記錄將被刪除時觸發此事件
onrowsinserted IE5、N 當前資料來源將要插入新資料記錄時觸發此事件
外部事件
onafterprint IE5、N 當文件被列印後觸發此事件
onbeforeprint IE5、N 當文件即將列印時觸發此事件
onfilterchange IE4、N 當某個物件的濾鏡效果發生變化時觸發的事件
onhelp IE4、N 當瀏覽者按下F1或者瀏覽器的幫助選擇時觸發此事件
onpropertychange IE5、N 當物件的屬性之一發生變化時觸發此事件
onreadystatechange IE4、N 當物件的初始化屬性值發生變化時觸發此事件

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 取消瀏覽器的事件傳遞

event.stopPropagation( );              // 阻止事件的進一步傳播,包括(冒泡,捕獲),無引數DOM標準 event.cancelBubble = true;            // true 為阻止冒泡IE