手寫通用的事件監(jiān)聽函數(shù)

前言

在問題前,需要先理解事件冒泡、事件代理

可參考文章【事件代理】 動(dòng)態(tài)數(shù)據(jù)列表里,如何監(jiān)聽每條數(shù)據(jù)的點(diǎn)擊?

具體實(shí)現(xiàn)如下:

DOM節(jié)點(diǎn):

<div id="div3">
    <a href="#">a1</a><br>
    <a href="#">a2</a><br>
    <a href="#">a3</a><br>
    <a href="#">a4</a><br>
    <button>加載更多...</button>
</div>

實(shí)現(xiàn)邏輯:

//通用的事件監(jiān)聽函數(shù)
function bindEvent(elem, type, selector,fn) {
    // step1.判斷傳參為 3 個(gè)還是 4 個(gè)
    if (fn == null) {//
        // 如果為3個(gè),默認(rèn)第3個(gè)賦值為函數(shù)
        fn = selector
        selector=null
    }
    // step2.做事件綁定
    elem.addEventListener(type,event=>{
        const target =event.target
        //step3.判斷是否傳入selector
        if (selector) {
            //代理綁定 -過濾指定選擇器的綁定
            if (target.matches(selector)) { //match() 方法可在字符串內(nèi)檢索指定的值,或找到一個(gè)或多個(gè)正則表達(dá)式的匹配。
               fn.call(target,event) //call 改變this的指向,調(diào)用的事件指向當(dāng)前選擇的DOM元素
            }
        }else{
            //普通綁定 -不過濾所有選擇器綁定都有效
            fn.call(target, event)
        }
        
    })
}

const div3 = document.getElementById('div3')
bindEvent(div3,'click','a',function(event){
    event.preventDefault();
    alert(this.innerHTML)
})

綜上所述實(shí)現(xiàn)原理:
Step1.判斷傳參為 3 個(gè)還是 4 個(gè)
Step2.給元素添加事件綁定
Step3.判斷是否傳入selector,若傳入,則為代理綁定,需要過濾指定選擇器的綁定;若未傳入,則為普通綁定 -不做過濾,所有選擇器綁定都有效

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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