事件

162 阅读1分钟
  • 事件绑定
  • 事件冒泡
  • 事件代理

事件绑定

    // 获取元素
    const btn = document.getElementById('btn')
    // 1.绑定点击事件
    btn.addEventListener('click', event=>{
        console.log('btn clicked')
    })
    
    // 2.通用事件绑定
    function bindEvent(ele,type,fn){\
        ele.addEventListener(type, fn)
    }
    
    // 调用
    bindEvent(btn,'click'e=>{
        e.preventDefault() // 阻止默认行为
        alert('btn clicked')
    })

事件冒泡

    <body>
        <div id="d1">
            <p>激活</p>
            <p>取消</p>
        </div>
        <div id="d2">
            <p>取消</p>
            <p>取消</p>
        </div>
    </body>
    <!--
        给body一个绑定事件,点击div获取p标签都会触发该事件 
        那么,p标签自身如果也有事件,那就会触发多个事件,所以事件冒泡是指
        最里层的元素具有外层元素的事件
    -->
    // 所以需要自己就用自己的事件,这样不乱套,阻止冒泡事件
    bindEvent(btn,'click',event=>{
        event.stopPropagation() // 阻止冒泡
    })

事件代理

    <div id="di">
        <a>aaa1</a>
        <a>aaa2</a>
        <a>aaa3</a>
        <button>but</button>
    </div>
    <button>点击增加一个a标签</button>
    <!--
        增加一个标签a,就会有一个点击事件
        所以把点击事件写在div,当增加的a标签后,会冒泡冒到div上
        这样div就代理了a标签的点击事件
        但是,点击button也会冒泡,所以需要进一步做判断
    -->
    const div = document.getElementById("di")
    bindEvent(div,'click',event=>{
        event.preventDefault()
        if(event.target.nodeName === 'A'){
            alert(event.target.innerHTML) // ...todo
        }
    })

升级绑定事件代码

需求:

1、支持普通绑定
2、支持代理绑定
    function (ele,type,selector,fn){
        if(fn==null){
            fn = selector
            selector = null
        }
        ele.addEventListener(type,funtion(event){
            const target = event.target
            if(selector){       // 代理绑定
                if(target.matches(selector)){
                    fn.call(target,event)
                }
            }else{              // 普通绑定
                fn.call(target,event)
            }
    })
    }