DOM 事件深刻淺出(二)

DOM事件深刻淺出(一)中,我主要給你們講解了不一樣DOM級別下的事件處理程序,同時介紹了事件冒泡和捕獲的觸發原理和方法。本文將繼續介紹DOM事件中的知識點,主要側重於DOM事件中Event對象的屬性和方法。javascript

那麼什麼是DOM事件中Event對象呢?事件對象(event object)指的是與特定事件相關且包含該事件詳細信息的對象。咱們能夠經過傳遞給事件處理程序的參數獲取事件觸發後所產生的一系列方法和屬性。html

Event對象

Event對象實際上是一個事件處理程序的參數,當調用事件時,咱們只須要將其傳入事件函數就能夠獲取。代碼以下:前端

function getEvent(event) {
    event = event || window.event;
}

上面的事件函數傳入了一個名叫Event的參數做爲事件對象,同時作了瀏覽器兼容處理。在IE8及之前本版之中,經過設置屬性註冊事件處理程序時,調用的時候並未傳遞事件對象,須要經過全局對象window.event來獲取。因此上述代碼中咱們利用 || 來作判斷,若是event對象存在則使用event,不存在則使用window.event。java

Event對象包含了幾個方法和多個屬性,經過這些方法和屬性咱們能夠獲取事件的詳細信息並進行相關處理。segmentfault

Event對象方法

Event對象主要有如下兩個方法,用於處理事件的傳播(冒泡、捕獲)和事件的取消。瀏覽器

1.stopPropagation

stopPropagation方法主要用於阻止事件的進一步傳播,好比阻止事件繼續向上層冒泡。微信

function getEvent(event) {
    event.stopPropagation();
}

child.addEventListener('click', getEvent, false);

若是你須要兼容IE8及如下版本瀏覽器,則須要利用cancelBubble來代替stopPropagation,由於低版本IE不支持stopPropagation方法。函數

function getEvent(event) {
    event = event || window.event;
        
    if (event.stopPropagation) {
        event.stopPropagation();
    } else {
        event.cancelBubble = true;
    }
}

cancelBubble是IE事件對象的一個屬性,設置這個屬性爲true能阻止事件進一步傳播。3d

2.preventDefault

preventDefault方法用於取消事件的默認操做,好比a連接的跳轉行爲和表單自動提交行爲就能夠用preventDefault方法來取消。代碼以下:code

<a id="go" href="https://www.baidu.com/">禁止跳轉</a>
var go = document.getElementById('go');

function goFn(event) {
    event.preventDefault();

    console.log('我沒有跳轉!');
}

go.addEventListener('click', goFn, false);

經過preventDefault,咱們成功阻止了a連接的跳轉行爲。不過,在IE9以前的瀏覽器中須要設置returnValue屬性爲false來實現。以下:

function goFn(event) {
    event = event || window.event;
    
    if (event.preventDefault) {
        event.preventDefault();
    } else {
        event.returnValue = false;
    }
    
    console.log('我沒有跳轉!');
}

除了以上Event對象的兩個主要方法,當前DOM事件規範草案在Event對象上還定義了另外一個方法,命名爲stopImmediatePropagation。

3.stopImmediatePropagation

和stopPropagation相比,stopImmediatePropagation一樣能夠阻止事件的傳播,不一樣點在於其還能夠把這個元素綁定的同類型事件也阻止了。如:

var go = document.getElementById('go');

function goFn(event) {
    event.preventDefault();
    event.stopImmediatePropagation(); // 阻止事件冒泡並阻止同類型事件
    
    console.log('我沒有跳轉!');
}

function goFn2(event) {
    console.log('我是同類型事件!');
}

go.addEventListener('click', goFn, false);
go.addEventListener('click', goFn2, false);

咱們在a連接上繼續加了一個點擊事件,若是咱們在goFn方法中添加了stopImmediatePropagation方法,那麼goFn2方法將不會被執行,同時也不會將點擊事件冒泡至上層。

須要注意的是,stopImmediatePropagation目前一部分瀏覽器尚不支持,可是像jQuery這樣的庫封裝了跨平臺的stopImmediatePropagation方法。

Event對象屬性

與Event對象的方法相比,因Event對象的屬性相對較多,文本沒法一一講解,因此主要介紹實際項目中經常使用的Event對象屬性。

1.type屬性

經過type咱們能夠獲取事件發生的類型,好比點擊事件咱們獲取的是'click'字符串。

var go = document.getElementById('go');

function goFn(event) {
    console.log(event.type); // 輸出'click'
}

go.addEventListener('click', goFn, false);

2.target屬性

target屬性主要用於獲取事件的目標對象,好比咱們點擊a標籤獲取的是a標籤的html對象。

var go = document.getElementById('go');

function goFn(event) {
    var target = event.target;
    
    console.log(target === go) // 返回true
}

go.addEventListener('click', goFn, false);

在IE8及以前版本,咱們須要使用srcElement而非target。兼容方案以下:

function goFn(event) {
    var event = event || window.event,    
        target = event.target || event.srcElement;
    
    console.log(target === go) // 返回true
}

3. 鼠標事件屬性

在用鼠標觸發事件時,主要的事件屬性包含鼠標的位置和按鍵的狀態,好比:clientX和clientY指定了鼠標在窗口座標中的位置,button和which指定了按下的鼠標鍵是哪一個。

function moveFn(event) {
    console.log(event.screenX) // 獲取鼠標基於屏幕的X軸座標
    console.log(event.screenY) // 獲取鼠標基於屏幕的Y軸座標
    console.log(event.clientX) // 獲取鼠標基於瀏覽器窗口的X軸座標
    console.log(event.clientY) // 獲取鼠標基於瀏覽器窗口的Y軸座標
    console.log(event.pageX) // 獲取鼠標基於文檔的X軸座標
    console.log(event.pageY) // 獲取鼠標基於文檔的Y軸座標
}

function clickFn(event) {
    console.log(event.button) // 獲取鼠標按下的鍵。非IE瀏覽器中0爲鼠標左鍵,1爲鼠標中鍵,2爲鼠標右鍵
    console.log(event.which) // 獲取指定事件上哪一個鍵盤鍵或鼠標按鈕被按下
}

document.addEventListener('mouseover', moveFn, false);
document.addEventListener('click', clickFn, false);

4.鍵盤事件屬性

在用鍵盤觸發事件時,主要的事件屬性包含鍵盤的按鍵keyCode和是否按下特殊鍵,好比:keyCode指定了按下鍵的鍵碼值,ctrlKey指定是否按下了ctrl鍵。

function keyFn(event) {
    console.log(event.keyCode); // 獲取按下鍵的鍵碼值
    console.log(event.ctrlKey); // 獲取是否按下了ctrl鍵
    console.log(event.shiftKey); // 獲取是否按下了shift鍵
    console.log(event.altKey); // 獲取是否按下了alt鍵
    console.log(event.metaKey); // 獲取是否按下了meta鍵
}

document.addEventListener('keyup', keyFn, false);

相似的事件屬性還有表單事件屬性和window事件屬性等,這裏再也不作詳細介紹。有興趣的同窗能夠查閱相關資料。

總結

本文主要講解了DOM事件中Event對象的經常使用屬性和方法,同時也介紹了其在IE中的兼容性問題及解決方案。然而關於DOM事件的知識點遠不止這些,但願僅此可以幫助初識DOM的開發者。

備註:文本參考自《Javascript權威指南》一書及慕課網教程《DOM事件揭祕》。

本文爲勞卜原創文章,首發於微信公衆號:前端呼啦圈(Love-FED)
轉載請註明來自——微信公衆號:前端呼啦圈(Love-FED)

相關文章
相關標籤/搜索