前端面試系列:DOM事件類

一、基本概念:

DOM事件的級別

  • DOM0: element.onclick=function(){}
  • DOM2: element.addEventListener('click',function(){},false)
  • DOM3: element.addEventLListener('keyup',function(){},false) 增加了很多事件類型
    注意:true表示在捕獲階段觸發(fā),false表示在冒泡階段觸發(fā),默認(rèn)是false。
    DOM1沒有設(shè)計和DOM事件相關(guān)相關(guān)的內(nèi)容。

二、DOM事件模型

  • 事件捕獲:從上往下找到目標(biāo)元素
  • 事件冒泡:從目標(biāo)元素往上查找

三、DOM事件流

瀏覽器為當(dāng)前頁面和用戶做交互的過程中發(fā)生的過程,一個完整的事件流分三個階段。

  • 事件捕獲
  • 目標(biāo)階段
  • 事件冒泡
    事件通過捕獲到達目標(biāo)元素,這個時候就是目標(biāo)階段,第三個階段就是從目標(biāo)元素上傳到window對象。

四、描述DOM事件捕獲的具體流程

window——>document——>html——>body——>父級元素——>...——>目標(biāo)元素

<body>
    <div id="ev">
        <style>
            #ev {
                width: 300px;
                height: 100px;
                background: #f00;
                color: #fff;
                text-align: center;
                line-height: 100px;
            }
        </style>
        目標(biāo)元素
    </div>
    <script type="text/javascript">
        var ev = document.getElementById("ev");
        ev.addEventListener('click', function() {
            console.log("ev capture");
        }, true);
        window.addEventListener('click', function() {
            console.log("window capture");
        }, true);
        document.addEventListener('click', function() {
            console.log("document capture");
        }, true);
        document.documentElement.addEventListener('click', function() {
            console.log("html capture");
        }, true);
        document.body.addEventListener('click', function() {
            console.log("body capture");
        }, true);
    </script>
</body>

// 打印結(jié)果是
// window capture
// document capture
// html capture
// body capture
// ev capture

五、Event對象的常見應(yīng)用

1、event.preventDefault():阻止默認(rèn)行為
2、event.stopPropagation() :阻止冒泡行為
3、event.stopImmediatePropagation() :阻止其他事件,事件響應(yīng)優(yōu)先級。(若一個按鈕綁定了兩個或多個事件:事件a、事件b、……。當(dāng)下場景想要實現(xiàn)點擊按鈕的時候只執(zhí)行事件a,其他事件不執(zhí)行,則在事件a的函數(shù)中加上event.stopImmeidiatePropagation()就能實現(xiàn))
4、event.currentTarget :當(dāng)前所被綁定的事件
5、event.target:當(dāng)前被點擊的元素(早期的ie版本不支持,早期ie用event.srcElement)

六、自定義事件(模擬事件)

1、自定義事件和自定義觸發(fā)事件的過程(只能指定事件名,不能給事件加數(shù)據(jù))

// 注冊事件
var eve = new Event("test");
// ev就是普通的DOM節(jié)點
ev.addEventListener("test",function(){
    //綁定事件名稱
    console.log("test");
},false);
// 此時是通過dispatchEvent自動觸發(fā)事件,通常和其他事件結(jié)合使用
ev.dispatchEvent(eve);
// 延時5秒后觸發(fā)
setTimeout(function() {
    ev.dispatchEvent(eve);
}, 5000);

2、除了指定事件名,還能給事件加一個Object,用來傳遞自定義參數(shù)

var eve = new Event("test", { detail: elem.dataset.time });
?著作權(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)容

  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的。 ??事件,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,715評論 1 11
  • 以下文章為轉(zhuǎn)載,對理解JavaScript中的事件處理機制很有幫助,淺顯易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy閱讀 3,174評論 1 10
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設(shè)計者無需花費時間糾纏JS復(fù)雜的高級特性。 1....
    LaBaby_閱讀 1,510評論 0 2
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設(shè)計者無需花費時間糾纏JS復(fù)雜的高級特性。 1....
    LaBaby_閱讀 1,276評論 0 1
  • 事件流: 事件流:頁面接收事件的順序。 IE定義的:事件冒泡流(由最具體的元素依次傳播到DOM樹的最上層的Docu...
    xiaoguo16閱讀 664評論 0 0

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