关于手写通用绑定事件,点击一次,触发两次回调函数

来源:11-3 什么是事件代理(面试必考)

hwjhuvbj

2022-02-22

代理绑定的情况下,点击一次“激活”,触发了两次回调。普通绑定不会出现这种情况。

<ul id="box">
    <li id="active">激活</li>
    <li>取消</li>
    <li>取消</li>
</ul>

function myBindEvent(element, type, selector, cb) {
    if (typeof selector === 'function') {
        cb = selector;
        selector = null;
    }
    element.addEventListener(type, event => {
        const target = event.target;
        console.log('selector:', selector)
        if (selector) {
            //  代理
            if (target.matches(selector)) {
                console.log(1)
                cb.call(target, event)
            }
        } else {
            //  普通
            console.log(2)
            cb.call(target, event)
        }
    }, true)
}

const box = document.getElementById('box');
myBindEvent(box, 'click', '#active', function (e) {
    e.stopPropagation()
    e.preventDefault()
    console.log(this.innerHTML)
})
myBindEvent(box, 'click', function (e) {
    console.log(this.innerHTML)
})

写回答

1回答

双越

2022-02-23

你绑定了两次,当然会触发两次。

第一次绑定,看着像是 stopPropagation 阻止冒泡了,但此时事件已经到了 box 上,而不是在 #active 上的。

0
0

一天时间高效准备前端技术一面 匹配大厂面试要求

针对时下面试高频考点,帮助新人js面试快速通关

4694 学习 · 1681 问题

查看课程