美文网首页
事件冒泡和捕获

事件冒泡和捕获

作者: 看到这朵小fa了么 | 来源:发表于2020-03-11 22:56 被阅读0次

    学习:https://www.cnblogs.com/gitByLegend/p/10492553.html

    事件的绑定

    dom事件的监听和触发都定义在EventTarget接口,所有节点都部署了这个接口,提供三个方法

    • addEventListener 添加监听事件
    • removeEventListener 移除监听事件
    • dispatchEvent 触发监听事件

    事件冒泡和捕获

    • 事件冒泡:从target被触发,冒泡从里向外,直到document对象
    • 事件捕获:从最外层document开始向内传播直到target节点
    • 同时存在的时候,先捕获后冒泡,如果想反过来,可以让捕获事件延后执行
    element.addEventListener(event, function, useCapture)
    

    addEventListener有三个参数,event是被绑定的元素,function是触发时调用的函数,useCapture是冒泡捕获的配置项,默认为false,只进行冒泡。
    第三个参数useCapture可以配置几个选项:capture,once,passive(监听函数不会调用事件的preventDefault,调用也会被忽略)

    冒泡还是捕获?

    当冒泡和捕获同时存在的时候,先捕获后冒泡,也就是说会先从document到target,再从target到document,遇到注册的事件就会被触发

    • 对于currentTarget 非target节点来说,会先捕获后冒泡触发
    • 对于target节点则会根据捕获冒泡函数注册的顺序进行触发

    IE兼容性

    ie9-通过attachEvent(event,function)来添加事件监听

             //添加事件
                function addEvent(obj,type,fn){
                    if(obj.addEventListener){
                        obj.addEventListener(type,fn,false);
                     }else{
                         obj.attachEvent("on"+type,fn);
                      }
               }
                //移除事件
                 function romeveEvent(obj,type,fn){
                   if(obj.removeEventListener){
                        obj.removeEventListener(type,fn)
                    }else{
                        obj.detachEvent("on"+type,fn);
                     }
                 }
    

    事件委托

    通过事件冒泡或者捕获实现事件委托减少代码,提高性能;对于之后添加的元素同样可以拥有事件。

    var onUl = document.getSelectQuery('ul')
    onUl.onclick = function(e){
         var event = e || event;
         if(event.nodeName.toLowerCase === 'li'){
            alert('li')
        }
    }
    
    

    阻止事件冒泡 IE(cancelBubble)

    • stopPropagation() 阻止事件的传播,但是不会阻止target其他监听事件的触发
    • stopImmidatePropagation() 阻止其他事件的触发和事件的传播

    事件委托和vue的优化

    学习:https://blog.csdn.net/saucxs/article/details/90612942

    我们可以看到在vue当中是没有事件委托的,有两个原因,其一是事件委托主要是解决的问题之一,事件的注册和移除,已经被vue解决,直接写@click即可,第二个是即使写了很多事件,vue会把相同的事件抽离出来,这样其实回调函数都是一个,已经是最小的损耗,最后我们可以在v-for上进行类似事件委托的实现,只需要在方法中判断是针对哪个子元素的事件。
    可以通过事件修饰符来进行冒泡事件的一些变更,比如
    .stop 阻止事件冒泡和捕获; .self 判断target为自身才会触发; .prevent 阻止默认事件; once 只触发一次;.capture 捕获模式 .passive 会告诉浏览器你不想阻止事件的默认行为,默认事件会立即触发,提高性能。

    相关文章

      网友评论

          本文标题:事件冒泡和捕获

          本文链接:https://www.haomeiwen.com/subject/solkjhtx.html