zoukankan      html  css  js  c++  java
  • javascript 事件冒泡和事件代理

    事件冒泡

      简单的讲,当子元素的事件处理函数被触发(如onclick),该事件会从事件源(当前子元素)逐级向上层元素传递,触发祖先元素的 onclik 事件,一直到最外层 html 根元素。

      这可能会带来困扰,不必要的事件处理函数被执行了,不过我们可以阻止事件冒泡。事件触发时,会传入一个event对象,它有一个 stopPropagation() 方法可以阻止事件冒泡。

      事件冒泡机制当然也有有利的一面,事件代理就是基于浏览器的事件冒泡机制。

    事件代理

      事件代理也叫事件委托,当我们需要为父元素的很多子元素添加事件时,可以通过把事件添加到父元素并把事件委托给父元素来触发事件处理函数。

      在开发中,我们有时会遇到给列表每一个子元素都添加一个事件,可以用遍历来操作,这种方法固然简单,但是如果这个列表有巨量的子元素的时候,就要消耗大量的性能,并且当子元素需要新增的时候,每增加一个子元素就需要遍历一次,这种方法就更不可取。

      事件委托不仅实现相同了功能,而且大大减少了DOM操作。

        <ul class="wrap">
            <li class="item">1111<button>删除</button></li>
            <li class="item">2222<button>删除</button></li>
            <li class="item">3333<button>删除</button></li>
            <li class="item">4444<button>删除</button></li>
            <li class="item">5555<button>删除</button></li>
        </ul>
        <button class="add">添加子元素</button>
    
        <script>
            let oWrap = document.getElementsByClassName('wrap')[0];
            let oItem = document.getElementsByClassName('item');
            let oAdd = document.getElementsByClassName('add')[0];
    
            oWrap.addEventListener('click',function(e){
                //判断事件目标元素是否为 li ,并显示它的第一个子节点的文本内容
                if(e.target && e.target.nodeName.toLowerCase() == 'li'){
                    console.log(e.target.childNodes[0].textContent);
                }
    
                //判断事件目标元素是否为 button ,删除它的父元素
                if(e.target && e.target.nodeName.toLowerCase() == 'button'){
                    oWrap.removeChild(e.target.parentNode);
                }
            })
            
            //添加子节点
            oAdd.addEventListener('click',function () { 
                let oLi = document.createElement('li');
                oLi.setAttribute('class','item');
                oLi.innerHTML = oItem.length+1+'<button>删除</button>';
                oWrap.appendChild(oLi);
            })
        </script>
  • 相关阅读:
    idea的alt+enter可以从菜单点吗
    idea能用下划线替换红色报错吗?我色弱,用idea简直太痛苦了
    Idea中JDK为1.8,还提示Diamond types are not supported at this language level
    idea中maven项目下载源码的方式的
    kafka删除topic后再创建同名的topic报错(ERROR org.apache.kafka.common.errors.TopicExistsException)
    Linux虚拟机的命令分发工具。
    关于git SSH Key的 生成
    Windows下Nginx+Mysql+Php(wnmp)环境搭建
    HTTP协议详解
    php面向对象中static静态属性和静态方法的调用
  • 原文地址:https://www.cnblogs.com/sspeng/p/9719854.html
Copyright © 2011-2022 走看看