第一百二十節,JavaScript事件對象

JavaScript事件對象html

 

 

學習要點:windows

1.事件對象數組

2.鼠標事件瀏覽器

3.鍵盤事件函數

4.W3C與IE學習

 

JavaScript事件的一個重要方面是它們擁有一些相對一致的特色,能夠給你的開發提供更多的強大功能。最方便和強大的就是事件對象,他們能夠幫你處理鼠標事件和鍵盤敲擊方面的狀況,此外還能夠修改通常事件的捕獲/冒泡流的函數。this

 

一.事件對象編碼

事件處理函數的一個標準特性是,以某些方式訪問的事件對象包含有關於當前事件的上下文信息。spa

事件處理三部分組成:對象.事件處理函數=函數。例如:單擊文檔任意處。code

//在頁面任意地方單擊鼠標觸發事件
document.onclick = function () {
    alert('Lee');
};

PS:以上程序的名詞解釋:click表示一個事件類型,單擊。onclick表示一個事件處理函數或綁定對象的屬性(或者叫事件監聽器、偵聽器)。document表示一個綁定的對象,用於觸發某個元素區域。function()匿名函數是被執行的函數,用於觸發後執行。

 

除了用匿名函數的方法做爲被執行的函數,也能夠設置成獨立的函數。

//在頁面任意地方單擊鼠標觸發事件
document.onclick = box;                        //直接賦值函數名便可,無須括號
function box() {
    alert('Lee');
}

 

this關鍵字和上下文

在面向對象那章咱們瞭解到:在一個對象裏,因爲做用域的關係,this表明着離它最近對象。

這裏的this表明的input元素對象,由於input元素對象被onclick綁定了

//<input type="text" value="文本"/>
window.onload = function () { //window.onload事件,等待html執行完成後,執行匿名函數
    var input = document.getElementsByTagName('input')[0];
    input.onclick = function () {
        alert(this.value);                    //HTMLInputElement,this表示input對象
    };
};

從上面的拆分,咱們並無發現本章的重點:事件對象。那麼事件對象是什麼?它在哪裏呢?當觸發某個事件時,會產生一個事件對象,這個對象包含着全部與事件有關的信息。包括致使事件的元素、事件的類型、以及其它與特定事件相關的信息。

 

事件對象

事件對象,咱們通常稱做爲event對象,這個對象是瀏覽器經過函數把這個對象做爲參數傳遞過來的。那麼首先,咱們就必須驗證一下,在執行函數中沒有傳遞參數,是否能夠獲得隱藏的參數。

//<input type="text" value="文本"/>
window.onload = function () { //window.onload事件,等待html執行完成後,執行匿名函數
    var input = document.getElementsByTagName('input')[0];
    box();

    function box() {                            //普通空參函數
        alert(arguments.length);                    //0,沒有獲得任何傳遞的參數
    }

    input.onclick = function () {                    //事件綁定的執行函數
        alert(arguments.length);                    //1,獲得一個隱藏參數
    };
};

 

event對象。

這個對象包含着全部與事件有關的信息。包括致使事件的元素、事件的類型、以及其它與特定事件相關的信息。

經過上面兩組函數中,咱們發現,經過事件綁定的執行函數是能夠獲得一個隱藏參數的。說明,瀏覽器會自動分配一個參數,這個參數其實就是event對象。

//<input type="text" value="文本"/>
window.onload = function () { //window.onload事件,等待html執行完成後,執行匿名函數
    var input = document.getElementsByTagName('input')[0];
    input.onclick = function () {
        alert(arguments[0]);                    //MouseEvent,鼠標事件對象
    };
};

事件執行的函數,能夠設置一個形式參數,這個形式參數接收到的是瀏覽器傳過來的event對象,也就是MouseEvent,鼠標事件對象

上面這種作法比較累,那麼比較簡單的作法是,直接經過接收參數來獲得便可

//<input type="text" value="文本"/>
window.onload = function () { //window.onload事件,等待html執行完成後,執行匿名函數
    var input = document.getElementsByTagName('input')[0];
    input.onclick = function (evt) {                //接受event對象,名稱不必定非要event
        alert(evt);                                //MouseEvent,鼠標事件對象
    };
};

直接接收event對象,是W3C的作法,IE不支持,IE本身定義了一個event對象,直接在window.event獲取便可。

兼容版本

//<input type="text" value="文本"/>
window.onload = function () { //window.onload事件,等待html執行完成後,執行匿名函數
    var input = document.getElementsByTagName('input')[0];
    input.onclick = function (evt) {
        var e = evt || window.event;                //實現跨瀏覽器兼容獲取event對象
        alert(e);
    };
};

 

二.鼠標事件

鼠標事件是Web上面最經常使用的一類事件,畢竟鼠標仍是最主要的定位設備。那麼經過事件對象能夠獲取到鼠標按鈕信息和屏幕座標獲取等。

1.鼠標按鈕

只有在主鼠標按鈕被單擊時(常規通常是鼠標左鍵)纔會觸發click事件,所以檢測按鈕的信息並非必要的。但對於onmousedown和onmouseup事件來講,則在其event對象存在一個button屬性,表示按下或釋放按鈕。

 

button屬性,返回鼠標信息的數值
使用方式:
event對象.button

//<input type="text" value="文本"/>
window.onload = function () { //window.onload事件,等待html執行完成後,執行匿名函數
    var input = document.getElementsByTagName('input')[0];
    input.onmouseup = function (evt) {     //當鼠標釋放時
        var e = evt || window.event;                //實現跨瀏覽器兼容獲取event對象
        alert(e.button);   //button屬性,返回鼠標信息的數值
        //點擊右鼠標返回0
        //中鼠標返回1
        //左鼠標返回2
        //注意:可是IE返回不同,IE有本身的數值
    };
};

 

非IE(W3C)中的button屬性

說明

0

表示主鼠標按鈕(常規通常是鼠標左鍵)

1

表示中間的鼠標按鈕(鼠標滾輪按鈕)

2

表示次鼠標按鈕(常規通常是鼠標右鍵)

 

IE中的button屬性

說明

0

表示沒有按下按鈕

1

表示主鼠標按鈕(常規通常是鼠標左鍵)

2

表示次鼠標按鈕(常規通常是鼠標右鍵)

3

表示同時按下了主、次鼠標按鈕

4

表示按下了中間的鼠標按鈕

5

表示同時按下了主鼠標按鈕和中間的鼠標按鈕

6

表示同時按下了次鼠標按鈕和中間的鼠標按鈕

7

表示同時按下了三個鼠標按鈕

 

PS:在絕大部分狀況下,咱們最多隻使用主次中三個單擊鍵,IE給出的其餘組合鍵通常沒法使用上。因此,咱們只須要作上這三種兼容便可。

鼠標按鈕信息兼容

//當用戶在頁面釋放鼠標時,執行匿名函數
document.onmouseup = function (evt) {  //設置一個參數接收瀏覽器傳過來的event對象
    if (getButton(evt) == 0) {   //將接收到的對象傳入getButton函數,判斷返回0打印裏面的字符串
        alert('按下了左鍵!');
    } else if (getButton(evt) == 1) {   //將接收到的對象傳入getButton函數,判斷返回1打印裏面的字符串
        alert('按下了中鍵!');
    } else if (getButton(evt) == 2) {   //將接收到的對象傳入getButton函數,判斷返回2打印裏面的字符串
        alert('按下了右鍵!');
    }
};

function getButton(evt) {    //跨瀏覽器左中右鍵單擊相應,接收event對象
    //若是沒有獲取到event對象,說明是ie瀏覽器就用window.event獲取
    var e = evt || window.event;
    if (evt) {        //若是event對象爲真,
        return e.button;         //就返回鼠標對應的數值
    } else if (window.event) {  //判斷若是ie方式返回真,就要作兼容,由於IE和w3c標準返回數值表明不一樣
        switch (e.button) {  //判斷event對象返回值
            case 1 :         //若是IE方式返回值是1
                return 0;    //返回w3c標準數值,使其統一
            case 4 :         //若是IE方式返回值是4
                return 1;    //返回w3c標準數值,使其統一
            case 2 :         //若是IE方式返回值是2
                return 2;    //返回w3c標準數值,使其統一
        }
    }
}

 

2.可視區及屏幕座標

事件對象提供了兩組來獲取瀏覽器座標的屬性,一組是頁面可視區座標,另外一組是屏幕座標。

 

座標屬性

屬性

說明

clientX

可視區X座標,距離左邊框的位置

clientY

可視區Y座標,距離上邊框的位置

screenX

屏幕區X座標,距離左屏幕的位置

screenY

屏幕區Y座標,距離上屏幕的位置

 

clientX屬性,可視區X座標,距離左邊框的位置
clientY屬性,可視區Y座標,距離上邊框的位置
screenX屬性,屏幕區X座標,距離左屏幕的位置
screenY屬性,屏幕區Y座標,距離上屏幕的位置

使用方式:

event對象.clientX

其餘相同

//當用戶在頁面任意地方點擊鼠標,執行匿名函數
document.onclick = function (evt) {  //接收一個event對象
    //若是沒法接收event對象,說明是ie瀏覽器,就用ie方式獲取event對象
    var e = evt || window.event;
    //打印clientX屬性,可視區X座標,距離左邊框的位置加,clientY屬性,可視區Y座標,距離上邊框的位置
    alert(e.clientX + ',' + e.clientY);
    //打印screenX屬性,屏幕區X座標,距離左屏幕的位置加,screenY屬性,屏幕區Y座標,距離上屏幕的位置
    alert(e.screenX + ',' + e.screenY);
};

 

3.修改鍵

有時,咱們須要經過鍵盤上的某些鍵來配合鼠標來觸發一些特殊的事件。這些鍵爲:Shfit、Ctrl、Alt和Meat(Windows中就是Windows鍵,蘋果機中是Cmd鍵),它們常常被用來修改鼠標事件和行爲,因此叫修改鍵。

修改鍵屬性

屬性

說明

shiftKey

判斷是否按下了Shfit鍵

ctrlKey

判斷是否按下了ctrlKey鍵

altKey

判斷是否按下了alt鍵

metaKey

判斷是否按下了windows鍵,IE不支持

shiftKey判斷是否按下了Shfit鍵
ctrlKey判斷是否按下了ctrlKey鍵
altKey判斷是否按下了alt鍵
metaKey判斷是否按下了windows鍵,IE不支持

使用方式:

event對象.shiftKey

其餘相同

//當用戶在頁面任意地方點擊是,執行匿名函數
document.onclick = function (evt) {  //接收一個參數event對象
    alert(getKey(evt)); //執行函數打印,將event對象當作參數傳入函數
};

function getKey(evt) {  //定義函數,接收event對象
    //若是瀏覽器不支持直接獲取event對象,說明是IE瀏覽器就用window.event獲取event對象
    var e = evt || window.event;
    var keys = [];   //建立一個空數組

    if (e.shiftKey) keys.push('shift');      //判斷若是用戶按下了shift鍵,向數組裏添加一個元素
    if (e.ctrlKey) keys.push('ctrl');    //判斷若是用戶按下了ctrl鍵,向數組裏添加一個元素
    if (e.altKey) keys.push('alt');      //判斷若是用戶按下了alt鍵,向數組裏添加一個元素

    return keys;  //返回數組
}

 

三.鍵盤事件

用戶在使用鍵盤時會觸發鍵盤事件。「DOM2級事件」最初規定了鍵盤事件,結果又刪除了相應的內容。最終仍是使用最初的鍵盤事件,不過IE9已經率先支持「DOM3」級鍵盤事件。

1.鍵碼

在發生onkeydown和onkeyup事件時,event對象的keyCode屬性中會包含一個代碼,與鍵盤上一個特定的鍵對應。對數字字母字符集,keyCode屬性的值與ASCII碼中對應小寫字母或數字的編碼相同。字母中大小寫不影響。也就是每個鍵對應一個數字

keyCode屬性,返回按鍵對應的按鍵碼,注意:事件要是鍵盤事件如onkeydown
使用方式:
event對象.keyCode

//當用戶按下任意鍵時,執行匿名函數
document.onkeydown = function (evt) {  //接收event對象
    //若是沒法直接獲取event對象,說明是IE瀏覽器就用IE的方法window.event獲取event對象
    var e = evt || window.event;
    alert(e.keyCode);     //打印按鍵對應的數字碼
};

不一樣的瀏覽器在onkeydown和onkeyup事件中,會有一些特殊的狀況:

在Firefox和Opera中,分號鍵時keyCode值爲59,也就是ASCII中分號的編碼;而IE和Safari返回186,即鍵盤中按鍵的鍵碼。

PS:其餘一些特殊狀況因爲瀏覽器版本太老和市場份額過低,這裏不作補充。

 

2.字符編碼

Firefox、Chrome和Safari的event對象都支持一個charCode屬性,這個屬性只有在發生onkeypress事件時才包含值,並且這個值是按下的那個鍵所表明字符的ASCII編碼。此時的keyCode屬性一般等於0或者也可能等於所按鍵的編碼。IE和Opera則是在keyCode屬性中保存字符的ASCII編碼。

charCode屬性,字符鍵所表明字符的ASCII編碼,注意:事件要是onkeypress鍵盤事件如onkeypress,
使用方式:
event對象.charCode

//當用戶按下字符鍵時,執行匿名函數
document.onkeypress = function (evt) {  //接收event對象
    //若是沒法直接獲取event對象,說明是IE瀏覽器就用IE的方法window.event獲取event對象
    var e = evt || window.event;
    alert(e.charCode);     //打印字符鍵所表明字符的ASCII編碼
};

字符按鍵支持全部瀏覽器兼容

window.onload = function () { //window.onload事件,等待html執行完成後,執行匿名函數
//當用戶按下字符鍵時,執行匿名函數
    document.onkeypress = function (evt) {  //接收event對象
        alert(getCharCode(evt));  //執行兼容函數

        function getCharCode(evt) {  //接收event對象
            //若是沒法直接獲取event對象,說明是IE瀏覽器,就用IE的window.event獲取event對象
            var e = evt || window.event;
            //判斷event對象的charCode屬性若是是數字類型
            if (typeof e.charCode == 'number') {
                //執行charCode屬性
                return e.charCode;
            } else {
                //不然執行keyCode屬性
                return e.keyCode;
            }
        }

    };
};

 可使用String.fromCharCode()將ASCII編碼轉換成實際的字符。

window.onload = function () { //window.onload事件,等待html執行完成後,執行匿名函數
//當用戶按下字符鍵時,執行匿名函數
    document.onkeypress = function (evt) {  //接收event對象
        alert(String.fromCharCode(getCharCode(evt)));  //將返回的ASCII編碼轉換成實際的字符

        function getCharCode(evt) {  //接收event對象
            //若是沒法直接獲取event對象,說明是IE瀏覽器,就用IE的window.event獲取event對象
            var e = evt || window.event;
            //判斷event對象的charCode屬性若是是數字類型
            if (typeof e.charCode == 'number') {
                //執行charCode屬性
                return e.charCode;
            } else {
                //不然執行keyCode屬性
                return e.keyCode;
            }
        }

    };
};

 

keyCode屬性和charCode屬性區別以下:好比當按下「a鍵(重視是小寫的字母)時,

在Firefox中會得到

onkeydown: keyCode is 65  charCode is 0

onkeyup:       keyCode is 65 charCode is 0

onkeypress: keyCode is 0  charCode is 97

 

在IE中會得到

onkeydown: keyCode is 65  charCode is undefined

onkeyup:   keyCode is 65  charCode is undefined

onkeypress: keyCode is 97  charCode is undefined

 

而當按下shift鍵時,在Firefox中會得到

onkeydown:keyCode is 16  charCode is 0

onkeyup: keyCode is 16   charCode is 0

 

在IE中會得到

onkeydown:keyCode is 16  charCode is undefined

onkeyup: keyCode is 16  charCode is undefined

 

onkeypress:不會得到任何的charCode屬性值,由於按shift並沒輸入任何的字符,而且也不會觸發onkeypress事務

 

PS:在onkeydown事務裏面,事務包含了keyCode屬性 – 用戶按下的按鍵的物理編碼。

在onkeypress裏,keyCode屬性包含了字符編碼,即默示字符的ASCII碼。如許的情勢實用於全部的瀏覽器 – 除了火狐,它在onkeypress事務中的keyCode屬性返回值爲0。

 

四.W3C與IE

在標準的DOM事件中,event對象包含與建立它的特定事件有關的屬性和方法。觸發的事件類型不同,可用的屬性和方法也不同。

 

W3C中event對象的屬性和方法

屬性/方法

類型

讀/寫

說明

bubbles

Boolean

只讀

代表事件是否冒泡

cancelable

Boolean

只讀

代表是否能夠取消事件的默認行爲

currentTarget

Element

只讀

其事件處理程序當前正在處理事件的那個元素

detail

Integer

只讀

與事件相關的細節信息

eventPhase

Integer

只讀

調用事件處理程序的階段:1表示捕獲階段,2表示「處理目標」,3表示冒泡階段

preventDefault()

Function

只讀

取消事件的默認行爲。若是cancelabel是true,則可使用這個方法

stopPropagation()

Function

只讀

取消事件的進一步捕獲或冒泡。若是bubbles爲true,則可使用這個方法

target

Element

只讀

事件的目標

type

String

只讀

被觸發的事件的類型

view

AbstractView

只讀

與事件關聯的抽象視圖。等同於發生事件的window對象

 

IE中event對象的屬性

屬性

類型

讀/寫

說明

cancelBubble

Boolean

讀/寫

默認值爲false,但將其設置爲true就能夠取消事件冒泡

returnValue

Boolean

讀/寫

默認值爲true,但將其設置爲false就能夠取消事件的默認行爲

srcElement

Element

只讀

事件的目標

type

String

只讀

被觸發的事件類型

 

在這裏,咱們只看全部瀏覽器都兼容的屬性或方法,也就是按照IE的來作兼容,由於IE有的,w3c都有,w3c有的IE不必定有

首先第一個咱們瞭解一下W3C中的target和IE中的srcElement,都表示事件的目標。

srcElement屬性,是IE中event對象的屬性,獲取事件event對象的標籤節點
target屬性,是W3C中event對象的屬性,獲取事件event對象的標籤節點

因此要作兼容

//當用戶在頁面任意地方單擊鼠標時,激發匿名函數
document.onclick = function (evt) {  //接收事件的event對象
    var target = getTarget(evt);   //將event對象傳入函數執行自定義函數,將函數賦值給一個變量
    alert(target.tagName);   //打印event對象裏獲取到的元素標籤名稱
};

function getTarget(evt) {  //自定義函數
    //若是沒法直接獲取event對象,說明是IE瀏覽器,就用IE的window.event獲取event對象
    var e = evt || window.event;
    //兼容方式獲取到event對象事件的元素標籤節點,也就是目標
    return e.target || e.srcElement;                
}

 經過事件獲得元素節點後,能夠對元素進行讀寫等操做

 

事件流

事件流是描述的從頁面接受事件的順序,當幾個都具備事件的元素層疊在一塊兒的時候,那麼你點擊其中一個元素,並非只有當前被點擊的元素會觸發事件,而層疊在你點擊範圍的全部元素都會觸發事件。事件流包括兩種模式:冒泡和捕獲。

事件冒泡,是從裏往外逐個觸發。事件捕獲,是從外往裏逐個觸發。那麼現代的瀏覽器默認狀況下都是冒泡模型,而捕獲模式則是早期的Netscape默認狀況。而如今的瀏覽器要使用DOM2級模型的事件綁定機制才能手動定義事件流模式。事件流模式講到事件綁定機制後在說

 冒泡模式

// <body>
// <div id="box" style="background-color: #ff0f20;width: 200px;height: 200px;">
//     <input type="button" value="肯定">
// </div>
// </body>
window.onload = function () { //window.onload事件,等待html執行完成後,執行匿名函數
    document.onclick = function () {
        alert('我是document');
    };
    document.documentElement.onclick = function () {
        alert('我是html');
    };
    document.body.onclick = function () {
        alert('我是body');
    };
    document.getElementById('box').onclick = function () {
        alert('我是div');
    };
    document.getElementsByTagName('input')[0].onclick = function () {
        alert('我是input');
    };
};
//當點擊一個元素時,會冒泡向外激發事件,也就是點擊一個元素激發事件後會自動激發父元素的事件

 

cancelBubble屬性,是IE中event對象的屬性,默認值爲false,但將其設置爲true就能夠取消事件冒泡
stopPropagation()方法,是W3C中event對象的方法,取消事件的進一步捕獲或冒泡。

取消冒泡模式:要在哪一個元素取消,就在哪一個元素執行取消冒泡函數

// <body>
// <div id="box" style="background-color: #ff0f20;width: 200px;height: 200px;">
//     <input type="button" value="肯定">
// </div>
// </body>
window.onload = function () { //window.onload事件,等待html執行完成後,執行匿名函數
    document.onclick = function () {
        alert('我是document');
    };
    document.documentElement.onclick = function () {
        alert('我是html');
    };
    document.body.onclick = function () {
        alert('我是body');
    };
    document.getElementById('box').onclick = function () {
        alert('我是div');
    };
    document.getElementsByTagName('input')[0].onclick = function (evt) {
        //執行取消冒泡函數
        stopPro(evt);  //將event對象傳入函數
        alert('我是input');
    };
};
//當點擊一個元素時,會冒泡向外激發事件,也就是點擊一個元素激發事件後會自動激發父元素的事件

//在阻止冒泡的過程當中,W3C和IE採用的不一樣的方法,那麼咱們必須作一下兼容。
function stopPro(evt) {  //取消冒泡函數
    //若是沒法直接獲取event對象,說明是IE瀏覽器,就用IE的window.event獲取event對象
    var e = evt || window.event;
    //若是window.event獲取event對象能執行就用cancelBubble = true取消冒泡,不然就用stopPropagation()取消冒泡
    window.event ? e.cancelBubble = true : e.stopPropagation();
}
相關文章
相關標籤/搜索