Js事件委托利用

今天来给大家分享一下关于事件委托的一些心得,相信程序猿门对于事件委托这四个字眼一定都非常熟悉了,事件委托又称之为事件代理,多用于来处理给一个dom元素绑定多个事件的情境下,那么事件委托好用么?答案显而易见 非常好用
JavaScript高级程序设计上对事件委托的定义是:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。
那么何为事件冒泡呢?不多上图!
事件冒泡是事件流事件中的一种,事件流又分为事件冒泡及事件捕获**

下面这个图片大家应该心领神会吧,气泡从水底开始往上升,由深到浅,升到最上面。在上升的过程中,气泡会经过不同深度层次的水。

在这里插入图片描述
相对应地:这个气泡就相当于我们这里的事件,而水则相当于我们的整个dom树;事件从dom 树的底层 层层往上传递,由下向上,由里而外,直至传递到dom的根节点的过程叫做事件冒泡。

无事件委托代码如下
无事件委托的代码问题:
1、浪费
2、后添加的节点,没有事件

  		<ul id = 'ul1'>
            <li>111</li>
            <li>222</li>
            <li>333</li>
           
        </ul>
        <button id = 'btn1'>添加新的li节点</button>
    

设置点击li标签变红色

   window.onload = function(){
          var oUl = document.getElementById("ul1");
           var aLis = oUl.getElementsByTagName("li");
                for(var i = 0; i < aLis.length; i++){
                    aLis[i].onclick = function(){
                        this.style.backgroundColor = "red";
                    }
                }
            		var oBtn = document.getElementById("btn1");
           			var i = 3;
           			oBtn.onclick = function(){
            		var newLi = document.createElement("li");
                    newLi.innerHTML = i++ * 111;
           		    oUl.appendChild(newLi);
                }
            }
            

页面效果,新添加的节点无点击事件

有事件委托代码
事件委托优点:
1.减少js代码浪费,减少js事件的冗余绑定,节约事件资源
2.提高js工作效率
3.可以解决动态添加的原色节点无法绑定事件的问题

        <ul id = 'ul1'>
             <li>111</li>
             <li>222</li>
             <li>333</li>
            
             <div>div111</div>
        </ul>
        <button id = 'btn1'>添加新的li节点</button>
   window.onload = function(){
             var oUl = document.getElementById("ul1");
             oUl.onclick = function(ev){
                 var e = ev || window.event;
                 var target = e.target || window.event.srcElement;
                 if(target.tagName.toLowerCase() == "li"){
                    //这就是我们想要的节点
                    target.style.backgroundColor = 'red';
                }
            }
            		var oBtn = document.getElementById("btn1");
           			 var i = 3;
            		oBtn.onclick = function(){
                    var newLi = document.createElement("li");
                    newLi.innerHTML = i++ * 111;
                    oUl.appendChild(newLi);
            }
        }

在这里插入图片描述
在这里插入图片描述
那么重点来了事件委托该怎么用呢!!不多xx上代码!

    window.onload = function(){
             1//li 的父节点ul
                    var ul = document.getElementsByTagName("ul")[0];
                    var li = document.getElementsByTagName("li");
                    for (var i = 0; i < li.length; i++) {
                        li[i].index = i;
                    }
              2//li 的父节点ul添加事件
                    ul.onclick = function(e){
                        e = e || event;
                        var target = e.target || e.srcElement;
              3//找到触发对象,如果触发对象,符合条件
                          	if(target.nodeName.toLowerCase() == "li"){
                             	alert(target.index);//获取ul li下的下标
                           	    alert(target.innerHTML);//获取ul li下的内容
        }
    }
}
                        
    <ul id = 'ul1'>
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
        <li>555</li>
    </ul>

总结了三个步骤来实现事件委托
1,先去找当前要添加事件得父节点或者祖先节点(上图中的ul)
2,将事件添加给找到得这个节点
3,找到触发对象,如果触发对象,符合条件,进行后续的操作 if(target.nodeName.toLowerCase() == “li”)
在这里插入图片描述

哈哈这是我总结了一些时间委托的技巧,不知大家看懂了没,欢迎大佬们提一些宝贵的意见!!下次见
by 凯文

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值