JavaScript事件之鼠標事件

1. 鼠標事件

在DOM3級事件中定義了9個鼠標事件:

  • click:在用戶單擊主鼠標按鈕(一般是左邊的按鈕)或按下回車鍵時觸發(fā)
  • dbclick:在用戶雙擊主鼠標按鈕時觸發(fā)
  • mousedown:在用戶按下了任意鼠標按鈕時觸發(fā)
  • mouseenter:在護鏢光標從元素外部首次移動到元素范圍之內(nèi)時觸發(fā),這個事件不冒泡,而且在鼠標移動到后代元素上也不會觸發(fā)
  • mouseleave:在位于元素上方的鼠標光標移動到元素范圍之外時觸發(fā)。這個事件不冒泡,而且在鼠標移動到后代元素上也不會觸發(fā)
  • mousemove:當鼠標指針在元素內(nèi)部移動時重復(fù)地觸發(fā)
  • mouseout:在鼠標指針位于一個元素上方,然后用戶將其移動到另一個元素時觸發(fā)
  • mouseover:在鼠標指針位于一個元素外部,然后用戶將其首次移入另一個元素邊界之內(nèi)時觸發(fā)
  • mouseup:在用戶釋放鼠標按鈕時觸發(fā)

觸發(fā)一個click事件會依次先后觸發(fā):

  • mousedown
  • mouseup
  • click

鼠標事件對象中保存著鼠標相對于視口、頁面和屏幕的坐標位置信息,通過這些信息可以精確地對鼠標事件進行控制。

  • clientX、clientY:鼠標事件發(fā)生時鼠標指針在視口(可以看見的區(qū)域)中的水平坐標和垂直坐標
  • pageX、pageY:鼠標事件發(fā)生時鼠標指針相對于整個頁面的位置坐標
  • screenX、screenY:鼠標事件發(fā)生時鼠標指針相對于整個屏幕的坐標信息

IE8及之前版本不支持事件對象上頁面坐標,但可以通過視口坐標和滾動信息計算出來。

var pageX = event.pageX, pageY = event.pageY;
if(pageX === undefined) {
    pageX = event.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
}
if(pageY === undefined) {
    pageXY = event.clientY + (document.body.scrollTop || document.documentElement.scrollTop);
}

mousedown和mouseup事件的event對象中存在著一個button屬性,表示按下或釋放的按鈕。DOM的button屬性有3個值:

  • 0:表示主鼠標按鈕(鼠標左鍵)
  • 1:表示中間的鼠標按鈕(鼠標滾輪)
  • 2:次鼠標按鈕(鼠標右鍵)

而IE8及之前版本中button屬性與DOM的button屬性有很大差異:

  • 0:沒有按下按鈕
  • 1:按下主鼠標按鈕
  • 2:按下次鼠標按鈕
  • 3:同時按下主、次鼠標按鈕
  • 4:按下中間按鈕
  • 5:同時按下主鼠標按鈕和中間按鈕
  • 6:同時按下次鼠標按鈕和中間按鈕
  • 7:同時按下三個按鈕

可以通過瀏覽器的hasFeature()方法來兼容IE和DOM:

var EventUtil = {
    getButton: function(event) {
        if(document.implementation.hasFeature("MouseEvents", "2.0") {
            return event.button;
        } else {
            switch(event.button) {
                case 0:
                case 1:
                case 3:
                case 5:
                case 7:
                    return 0;
                case 2:
                case 6:
                    return 2;
                case 4:
                    return 1;
            }
        }
    }
}

2. 鼠標滾輪事件 mousewheel

mousewheel事件對應(yīng)的event對象中除包含鼠標事件的所有標準信息外,還包含一個特殊的wheelDelta屬性。當用戶向前滾動鼠標滾輪時,wheelDelta是120的倍數(shù);當鼠標滾輪向后滾動是,wheelDelta是-120的倍數(shù)。對于Opera9.5之前的版本中,wheelDelta值的正負號是相反的。Firefox支持一個名為DOMMouseScroll的事件,也是在鼠標滾輪滾動是觸發(fā),而且該事件會冒泡到window對象中,而有關(guān)鼠標滾動信息保存在detail屬性中,當鼠標滾輪向前滾動時,這個屬性值是-3的倍數(shù),向后滾動時是3的倍數(shù)。
跨瀏覽器環(huán)境下的解決方案:

if(event.wheelDelta) {
    return event.wheelDelta;
} else {
    return -event.detail*40;  //Firefox
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • DOM3級事件中定義了以下9個鼠標事件: click:在用戶單擊主鼠標按鈕或者按下回車鍵時觸發(fā)。意味著onclic...
    陸lmj閱讀 1,312評論 0 1
  • 事件流 IE和Netscape開發(fā)團隊提出了完全相反的兩種事件流的概念,事件冒泡流和事件捕獲流。 事件冒泡 事件由...
    exialym閱讀 1,047評論 0 9
  • Web 瀏覽器中可能發(fā)生的事件有很多類型。如前所述,不同的事件類型具有不同的信息,而 DOM3 級事件規(guī)定了以下幾...
    More_5897閱讀 1,062評論 1 0
  • 13.1 事件流 “DOM2級事件”規(guī)定事件流包括3個階段:事件捕獲階段,處于目標階段,事件冒泡階段。事件捕獲表示...
    Elevens_regret閱讀 526評論 0 0
  • 江南好,風景舊曾諳。日出江花紅勝火,春來江水綠如藍,能不憶江南。 ——題記 (一) 我承認自己是一個薄情的人。...
    葉葉素心閱讀 1,470評論 9 38

友情鏈接更多精彩內(nèi)容