事件類型--鼠標(biāo)與滾輪事件

DOM3級(jí)事件中定義了以下9個(gè)鼠標(biāo)事件:

  1. click:在用戶單擊主鼠標(biāo)按鈕或者按下回車鍵時(shí)觸發(fā)。意味著onclick事件處理程序既可以通過鍵盤也可以i通過鼠標(biāo)執(zhí)行。
  2. dbclick:在用戶雙擊主鼠標(biāo)按鈕時(shí)觸發(fā)。(在DOM2中沒有規(guī)定,在DOM3中做了規(guī)定)
  3. mousedown:在用戶按下任意鼠標(biāo)按鈕時(shí)觸發(fā)。
  4. mouseenter:在鼠標(biāo)光標(biāo)從元素外部首次移動(dòng)到元素范圍之內(nèi)時(shí)觸發(fā)。(在DOM2中沒有規(guī)定,在DOM3中做了規(guī)定)
  5. mouseleave:在位于元素上方的鼠標(biāo)光標(biāo)移動(dòng)到元素范圍之外時(shí)觸發(fā)。(在DOM2中沒有規(guī)定,在DOM3中做了規(guī)定)
  6. mousemove:當(dāng)鼠標(biāo)指針在元素內(nèi)部移動(dòng)時(shí)重復(fù)的觸發(fā)。
  7. mouseout:在鼠標(biāo)位于一個(gè)元素上方,然后移動(dòng)到另一個(gè)元素時(shí)觸發(fā),另一個(gè)元素可以位于另一個(gè)元素的外部,也可以是這個(gè)元素的子元素;不能通過鍵盤觸發(fā)。
  8. mouseover:在鼠標(biāo)位于一個(gè)元素外部,然后將其首次移動(dòng)到另一個(gè)元素邊界之內(nèi)時(shí)觸發(fā);不能通過鍵盤觸發(fā)
  9. mouseup:釋放鼠標(biāo)按鈕時(shí)觸發(fā);不能通過鍵盤觸發(fā)。
    除了mouseenter、mouseleave、dbclick是“DOM3級(jí)事件”新增之外,其它事件都是“DOM2級(jí)事件”中定義的。
    在一個(gè)元素上相繼觸發(fā)mousedown和mouseup事件,才會(huì)觸發(fā)click事件。兩次click事件相繼觸發(fā)才會(huì)觸發(fā)dblclick事件。如果取消 了mousedown或mouseup中的一個(gè),click事件就不會(huì)被觸發(fā)。直接或間接取消了click事件,dblclick事件就不會(huì)被觸發(fā)了。
    這四個(gè)事件的觸發(fā)順序如下:
    (1)mousedown
    (2)mouseup
    (3)click
    (4)mousedown
    (5)mouseup
    (6)click
    (7)dbclick
    可以使用如下代碼檢測(cè)瀏覽器是否支持“DOM2級(jí)”鼠標(biāo)事件:
1 var isSupported = document.implementation.hasFeature("MouseEvents", "2.0");
2 alert(isSupported);    //true

是否支持“DOM3級(jí)”鼠標(biāo)事件:

1 var isSupported = document.implementation.hasFeature("MouseEvent", "3.0");
2 alert(isSupported);    //true

注意:“DOM3級(jí)”鼠標(biāo)事件的feature名為MouseEvent;而“DOM2級(jí)”為MouseEvents
滾輪事件其實(shí)就是一個(gè)mousewheel事件。

1、客戶區(qū)坐標(biāo)位置

通過事件對(duì)象event的clientX和clientY屬性,可以訪問事件發(fā)生時(shí)鼠標(biāo)指針在視窗中的水平和垂直坐標(biāo)

 EventUtil.addHandler(document, "click", function(event) {
     event =EventUtil.getEvent(event);
     alert("鼠標(biāo)指針客戶區(qū)坐標(biāo)為:水平距離—" + event.clientX + ";" + "垂直距離—" + event.clientY + "");
 });

注意:這些值不包括頁面滾動(dòng)的距離,因此這個(gè)位置并不表示鼠標(biāo)在頁面上的位置

2、頁面坐標(biāo)位置

客戶區(qū)坐標(biāo)可以知道鼠標(biāo)是在視口的什么位置發(fā)生的,而通過事件對(duì)象event的pageX和pageY屬性,可以訪問事件發(fā)生時(shí)鼠標(biāo)指針在頁面中的水平和垂直坐標(biāo)

 EventUtil.addHandler(document, "click", function(event) {
     event = EventUtil.getEvent(event);
     alert("鼠標(biāo)指針頁面坐標(biāo)為:水平距離—" + event.pageX + ";" + "垂直距離—" + event.pageY);
4 });

在頁面沒有滾動(dòng)的情況下,pageX和pageY的值與clientX和clientY的值相等。
IE8及更早版本不支持事件對(duì)象上的頁面坐標(biāo),不過可以使用客戶區(qū)坐標(biāo)和滾動(dòng)信息計(jì)算出來。需要用到document.body(混雜模式)或者document.documentElement(標(biāo)準(zhǔn)模式)中的scrollLeft和scrollTop屬性。

  EventUtil.addHandler(document, "click", function(event) {
      event = EventUtil.getEvent(event);
      var pageX = event.pageX;
      var pageY = event.pageY;
      if(pageX === undefined) {
          pageX = event.clientX + (document.body.scrollLeft || document.documentElememt.scrollLeft);
      };
      if(pageY === undefined) {
          pageY = event.clientY + (document.body.scrollTop || document.documentElememt.scrollTop);
     };
     alert("鼠標(biāo)指針頁面坐標(biāo)為:水平距離—" + pageX + ";" + "垂直距離—" + pageY);
 });
3、屏幕坐標(biāo)位置

通過事件對(duì)象event的screenX和screenY屬性,可以訪問事件發(fā)生時(shí)鼠標(biāo)指針在電腦屏幕中的水平和垂直坐標(biāo)

 event_util.addHandler(document, "click", function(event) {
     event = event_util.getEvent(event);
     alert("鼠標(biāo)指針屏幕坐標(biāo)為:水平距離—" + event.screenX + ";" + "垂直距離—" + event.screenY);
 });
4、修改鍵

Shift、Ctrl、Alt、Meta這些修改鍵經(jīng)常被用來修改鼠標(biāo)事件的行為,DOM為此規(guī)定了4個(gè)屬性,表示這些修改鍵的狀態(tài):shiftKey、ctrlKey、altKey、metaKey。這些屬性中包含的都是布爾值,如果值為true,表示相應(yīng)的鍵被按下,否則為false。當(dāng)某個(gè)鼠標(biāo)事件發(fā)生時(shí),通過檢測(cè)這4個(gè)屬性,就能確定用戶是否按下某個(gè)修改鍵。

        var div = document.getElementById("myDiv");
        EventUtil.addHandler(div, "click", function(event){
            event = EventUtil.getEvent(event);
            var keys = new Array();
        //當(dāng)屬性值為true時(shí),將對(duì)應(yīng)修改鍵的名稱田間到keys數(shù)組中
            if (event.shiftKey){
                keys.push("shift");
            }
            if (event.ctrlKey){
                keys.push("ctrl");
            }
            if (event.altKey){
                keys.push("alt");
            }
            if (event.metaKey){
                keys.push("meta");
            }
            alert("Keys: " + keys.join(","));
        }); 
5、相關(guān)元素

對(duì)mouseover事件而言,事件的主目標(biāo)就是獲得光標(biāo)的元素,而相關(guān)元素就是失去光標(biāo)的那個(gè)元素;對(duì)mouseout事件而言,事件的主目標(biāo)就是失去光標(biāo)的元素,而相關(guān)元素就是獲得光標(biāo)的那個(gè)元素。DOM通過event事件對(duì)象的relatedTarget屬性提供了相關(guān)元素的信息,這個(gè)屬性只對(duì)mouseover和mouseout事件才包含值;對(duì)于其他事件,其值為null。
IE8及之前版本不支持relatedTarget屬性,但提供相似的屬性。在mouseover事件觸發(fā)時(shí),IE的fromElement屬性中保存著相關(guān)元素;在mouseout事件觸發(fā)時(shí),IE的toElement屬性中保存了相關(guān)元素。
IE9支持所有的這些屬性。
將跨瀏覽器取得相關(guān)元素的方法getRelatedTarge()添加到EventUtil對(duì)象中。

getRelatedTarget: function(event) {
    if(event.relatedTarget) {
        return event.relatedTarget;
    } else if(event.fromElement) {
        return event.fromElement;
    } else if(event.toElement) {
        return event.toElement;
    } else {
        return null;
    }
}
6、鼠標(biāo)按鈕

只有在主鼠標(biāo)按鈕被單擊(或鍵盤回車鍵被按下)時(shí)才會(huì)觸發(fā)click事件,所以需要檢測(cè)按鈕的信息,對(duì)于mousedown和mouseup事件而言,在event事件對(duì)象中存在一個(gè)button屬性,表示按下或釋放的按鈕。DOM中的button屬性可能有以下三個(gè)值:0,表示主鼠標(biāo)按鈕(鼠標(biāo)左鍵);1,表示中間按鈕;2,表示次鼠標(biāo)按鈕(鼠標(biāo)右鍵)。IE8及之前版本中,也提供button屬性,但其屬性值與DOM的不太通屬性值有很大差別。

  • 0:沒有按下鼠標(biāo)按鈕;
  • 1:主鼠標(biāo)按鈕;
  • 2:次鼠標(biāo)按鈕;
  • 3:同時(shí)按下主鼠標(biāo)按鈕和次鼠標(biāo)按鈕;
  • 4:中間鼠標(biāo)按鈕;
  • 5:同時(shí)按下主鼠標(biāo)按鈕和中間鼠標(biāo)按鈕;
  • 6:同時(shí)按下次鼠標(biāo)按鈕和中間鼠標(biāo)按鈕;
  • 7:同時(shí)按下三個(gè)鼠標(biāo)按鈕
    EventUtil對(duì)象添加getButton()方法。
var EventUtil={
//省略其他代碼
getButton: function(event) {
    if(document.implementation.hasFeature("MouseEvents", "2.0")) {   //確定event對(duì)象中存在的button屬性中是否包含正確的值
        return event.button;
    } else {         //不包含正確的值,說明是ie,需要對(duì)相應(yīng)的值進(jìn)行規(guī)范化,將IE模型規(guī)范化為DOM方式
        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;
        }
    }
}
//省略其他代碼
}
7、更多的事件信息

對(duì)于鼠標(biāo)事件來說,detail屬性中包含一個(gè)數(shù)值,表示在給定位置上發(fā)生多少次單擊;在同一個(gè)位置上相繼發(fā)生mousedown和mouseup事件算作一次單擊。detail從1開始計(jì)數(shù)。如果鼠標(biāo)在mousedown和mouseup事件之間移動(dòng)了位置,則detail的值會(huì)被重置為0。

8、鼠標(biāo)滾輪事件

當(dāng)用戶通過鼠標(biāo)滾輪與頁面交互、在垂直方向上滾動(dòng)頁面時(shí),會(huì)觸發(fā)mousewheel事件,該事件可以在任何元素上觸發(fā),最終會(huì)冒泡到document(IE8)或window(IE9、Opera、Chrome和Safari)對(duì)象。與mousewheel事件對(duì)應(yīng)的event對(duì)象除了包含鼠標(biāo)事件的所有標(biāo)準(zhǔn)信息之外,還包含一個(gè)特殊的wheelDelta屬性;當(dāng)用戶向前滾動(dòng)鼠標(biāo)滾輪時(shí),wheelDelta是120的倍數(shù),當(dāng)用戶向后滾動(dòng)鼠標(biāo)滾輪時(shí),wheelDelta是-120的倍數(shù)。
下述代碼可以得到wheelDelta的值,但多數(shù)情況下,只需要知道滾動(dòng)鼠標(biāo)滾輪的方向,而這通過檢測(cè)wheelDelta的正負(fù)號(hào)就可以確定。

EventUtil.addHandler(document, "mousewheel", function(event) {
     event = EventUtil.getEvent(event);
     alert(event.wheelDelta);
 });

注意:在Opera9.5及之前版本中,wheelDelta的正負(fù)號(hào)是顛倒的;可以使用瀏覽器檢測(cè)技術(shù)來確定實(shí)際的值,如下:

EventUtil.addHandler(document, "mousewheel", function(event) {
    event = EventUtil.getEvent(event);
    var delta = (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta : event.wheelDelta)
    alert(delta);
});

在Firefox瀏覽器中,支持一個(gè)名為DOMMouseScroll的事件,也是在鼠標(biāo)滾輪滾動(dòng)時(shí)觸發(fā),其被視為鼠標(biāo)事件,包含與鼠標(biāo)事件有關(guān)的所有信息;而有關(guān)鼠標(biāo)滾輪的信息則保存在detail屬性中,當(dāng)向前滾動(dòng)滾輪時(shí),其值為-3的倍數(shù),當(dāng)向后滾動(dòng)滾輪時(shí),其值為3的倍數(shù)。
可以將DOMMouseScroll事件添加到頁面中的任何元素,而且該事件會(huì)冒泡到window對(duì)象。所以可以像下面這樣針對(duì)這個(gè)事件來添加事件處理程序:

 EventUtil.addHandler(document, "DOMMouseScroll", function(event) {
     event =EventUtil.getEvent(event);
     alert(event.detail);
 });

跨瀏覽器環(huán)境下的解決方案:

getWheelDelta: function(event) {
    if(event.wheelDelta) {
        return event.wheelDelta;
    } else {
        return -event.detail * 40;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • 事件流 IE和Netscape開發(fā)團(tuán)隊(duì)提出了完全相反的兩種事件流的概念,事件冒泡流和事件捕獲流。 事件冒泡 事件由...
    exialym閱讀 952評(píng)論 0 9
  • 總結(jié): 鼠標(biāo)事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,626評(píng)論 2 10
  • Web 瀏覽器中可能發(fā)生的事件有很多類型。如前所述,不同的事件類型具有不同的信息,而 DOM3 級(jí)事件規(guī)定了以下幾...
    More_5897閱讀 941評(píng)論 1 0
  • 1. 鼠標(biāo)事件 在DOM3級(jí)事件中定義了9個(gè)鼠標(biāo)事件: click:在用戶單擊主鼠標(biāo)按鈕(一般是左邊的按鈕)或按下...
    MaterialCoder閱讀 4,161評(píng)論 0 3
  • 轉(zhuǎn)載。 拉鏈法實(shí)現(xiàn)HashTable-拉鏈法實(shí)現(xiàn)原理 線性探測(cè)法實(shí)現(xiàn)HashTable-線性探測(cè)法實(shí)現(xiàn)原理.jpg
    ybin閱讀 1,067評(píng)論 0 1