码迷,mamicode.com
首页 > Web开发 > 详细

理解事件委托(1):js中的事件委托

时间:2016-08-10 18:56:14      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:

什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。

也就是:利用冒泡的原理,把事件加到父级上,触发执行效果。

好处呢:1,提高性能。

我们可以看一个例子:需要触发每个li来改变他们的背景颜色。

<body>
    <ul id="number">
        <li>a</li>
        <li>b</li>
        <li>c</li>
    </ul>
    <input type="button" value="add" id="add" />
</body>
<script>
    window.onload=function(){
        var ul=document.getElementById("number");
        var li=ul.getElementsByTagName("li");

        for (var i = 0; i < li.length; i++) {
            li[i].onmouseover=function(){
                this.style.background="red";
            }
            li[i].onmouseout=function(){
                this.style.background="white";
            }
        };
    }
</script>

 

这样我们就可以做到li上面添加鼠标事件。

但是如果说我们可能有很多个li用for循环的话就比较影响性能。

下面我们可以用事件委托的方式来实现这样的效果。html不变

<script>
    window.onload=function(){
        var ul=document.getElementById("number");
        var li=ul.getElementsByTagName("li");

        ul.onmouseover=function(ev){
            var ev=ev||window.event;
            var target=ev.target||ev.srcElement;
            if(target.nodeName.toLowerCase()=="li"){
                target.style.background="red";
            }
        }
        ul.onmouseout=function(ev){
            var ev=ev||window.event;
            var target=ev.target||ev.srcElement;
            if(target.nodeName.toLowerCase()=="li"){
                target.style.background="white";
            }
        }
    }
</script>

 

好处2,新添加的元素还会有之前的事件。

我们还拿这个例子看,但是我们要做动态的添加li。点击button动态添加li,这样做我们可以看到点击按钮新加的li上面没有鼠标移入事件来改变他们的背景颜色。

因为点击添加的时候for循环已经执行完毕。

那么我们用事件委托的方式来做。就是html不变

<script>
    window.onload=function(){
        var ul=document.getElementById("number");
        var li=ul.getElementsByTagName("li");
        var add=document.getElementById("add");

        add.onclick=function(){
            var li=document.createElement("li");
            li.innerHTML="z";
            ul.appendChild(li);
        }

        ul.onmouseover=function(ev){
            var ev=ev||window.event;
            var target=ev.target||ev.srcElement;
            if(target.nodeName.toLowerCase()=="li"){
                target.style.background="red";
            }
        }
        ul.onmouseout=function(ev){
            var ev=ev||window.event;
            var target=ev.target||ev.srcElement;
            if(target.nodeName.toLowerCase()=="li"){
                target.style.background="white";
            }
        }
    }
</script>

 

ok:

如同在我们用微博中,新发微博照样有之前的鼠标事件。

原文地址:http://www.tuicool.com/articles/jQZj6zB

理解事件委托(1):js中的事件委托

标签:

原文地址:http://www.cnblogs.com/xiaohuilong/p/5757696.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!