美文网首页
JS一步一步来说说事件委托(或者叫事件代理)

JS一步一步来说说事件委托(或者叫事件代理)

作者: 人笨就要慢慢学 | 来源:发表于2018-12-26 10:56 被阅读0次

一步一步来说说事件委托(或者有的资料叫事件代理)

  • js中事件冒泡我们知道,子元素身上的事件会冒泡到父元素身上。
  • 事件代理就是,本来加在子元素身上的事件,加在了其父级身上。
  • 那就产生了问题:父级那么多子元素,怎么区分事件本应该是哪个子元素的?
  • 答案是:event对象里记录的有“事件源”,它就是发生事件的子元素。
  • “事件源”它存在兼容性问题,在老的IE下,事件源是 window.event.srcElement,其他浏览器是 event.target
    用事件委托有什么好处呢?
  • 第一个好处是效率高,比如,不用for循环为子元素添加事件了
  • 第二个好处是,js新生成的子元素也不用新为其添加事件了,程序逻辑上比较方便

还是用一个例子来说明吧

例子1. 页面有个ul包含着4个li,鼠标移动到li上,li背景变成红色,移出,背景恢复原色。

如果按照以前的写法,代码如下:

        <ul id="ul1">
            <li>111</li>
            <li>222</li>
            <li>333</li>
            <li>444</li>
        </ul>
        
        <script type="text/javascript">
            window.onload = function(){
                var oUl = document.getElementById('ul1');
                var aLi = oUl.children;
                console.log(aLi);
                
                //传统方法,li身上添加事件,需要用for循环,找到每个li
                for (var i=0;i<aLi.length;i++) {
                    aLi[i].onmouseover = function() {
                        this.style.background = 'red';
                    }
                    aLi[i].onmouseout = function(){
                        this.style.background = '';
                    }
                }//for结束

                
            }
        </script>

现在用事件委托的方式,onmouseover、onmouseout方法要加在ul身上了,再通过找事件源的方式,改变li背景,代码如下:

上面ul的html代码不变,js部分变为

<script type="text/javascript">
            window.onload = function(){
                var oUl = document.getElementById('ul1');                
                oUl.onmouseover = function(ev){
                    var ev = ev || window.event;
                    var oLi = ev.srcElement || ev.target;
                    oLi.style.background = 'red';                    
                }
                
                oUl.onmouseout = function(ev){
                    var ev = ev || window.event;
                    var oLi = ev.srcElement || ev.target;
                    oLi.style.background = '';                    
                }
                
            }
</script>

效果如下:


image

但是会发现,鼠标移到了ul身上而不是某个li身上时,获取的事件源是ul,那么整个ul背景将变红,这不是想要的结果,怎么办?

答曰:加个判断。通过事件源的nodeName判断是不是li,是才做出反应,不是不理它。为了防止nodeName在不同浏览器获取的字母大小写不同,加个toLowerCase()

所以,上面的js代码更改如下:

<script type="text/javascript">
            window.onload = function(){
                var oUl = document.getElementById('ul1');
                
                oUl.onmouseover = function(ev){
                    var ev = ev || window.event;
                    var oLi = ev.srcElement || ev.target;
                    if(oLi.nodeName.toLowerCase() == 'li'){
                        oLi.style.background = 'red';
                    }
                                        
                }
                
                oUl.onmouseout = function(ev){
                    var ev = ev || window.event;
                    var oLi = ev.srcElement || ev.target;
                    if(oLi.nodeName.toLowerCase() == 'li'){
                        oLi.style.background = '';
                    }                
                }

                
            }
</script>
image

这就不用for循环写一堆了,下面再来说说第二个好处:js新生成的子元素也不用新为其添加事件了,程序逻辑上比较方便

上面的文件,假如我再新添加个按钮,点击按钮,ul里就新增加个li,如果用传统的方法,for循环为li添加事件,问题就出现了,最开始有的4个li是有onmouseover和onmouseout事件的,但是后来动态生成的li里没有这两个事件处理函数,因为for循环的时候它还没生成。怎么办呢?只能在按钮点击后,生成li,然后再为生成的li再绑定事件,真是麻烦的很。而事件委托的方式就没事,当后来动态生成的li出现的时候,不用做改变,移到它身上,还是变色的,因为事件是绑定在ul身上的。

新浪微博里,当你发一条新微博出去,发出去的信息在页面上显示,鼠标移动到新发的信息的人头像上时,依然会有很多事件,如果用原来的方式,就要做很多处理,事件委托的话,就很方便了!

相关文章

  • JS一步一步来说说事件委托(或者叫事件代理)

    一步一步来说说事件委托(或者有的资料叫事件代理) js中事件冒泡我们知道,子元素身上的事件会冒泡到父元素身上。 事...

  • 前端知识二

    事件委托(事件代理) 事件委托也可以叫事件代理,是事件冒泡与事件捕获的运用。 基本概念 一般来讲,会把一个或者一组...

  • JS写事件代理

    js中的事件委托或是事件代理详解

  • js事件委托

    前言 事件委托,也叫事件代理,是js事件中的一种常用技巧。事件委托的原理就是利用冒泡事件的机制,为一些节点的祖先节...

  • 前端常见面试题(十一)@郝晨光

    什么是事件委托?为什么要用事件委托? 什么是事件委托? 事件委托,又称事件代理,就是将元素的事件处理交由父元素或者...

  • js 事件委托 事件代理

    js 事件委托 事件代理 JavaScript高级程序设计上解释:事件委托就是利用事件冒泡,只指定一个事件处理程序...

  • 事件委托(事件代理)

    事件委托还有一个名字叫事件代理,JS高程上讲:事件委托就是利用事件冒泡,只制定一个事件处理程序,就可以管理某一类型...

  • js事件委托/事件代理

    事件委托就是利用事件冒泡,只指定一个时间处理程序就可以管理某一类型的所有事例。 优点:提高性能 JavaScrip...

  • JS事件委托(事件代理)

    什么是事件委托? 举个例子,我们要实现点击 li 时打印其id 一般我们会给每一个li绑定一个事件处理函数 这种方...

  • js事件委托(事件代理)

    定义:事件委托就是在DOM事件的冒泡阶段,把具体dom上发生的事件委托给父元素或祖先元素去处理。原理:要了解委托的...

网友评论

      本文标题:JS一步一步来说说事件委托(或者叫事件代理)

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