当前位置:首页 > 学习提升 > javascript > 正文内容

请解释什么是事件委托/事件代理

自由小鸟2年前 (2023-01-03)javascript1231

什么是事件委托

事件委托也称之为事件代理(Event Delegation)。是JavaScript中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定在子元素的响应事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡
先看一个示例:
例1.1设置一个无序列表ul,含有多个li标签,点击任意一个li标签,li标签就会变红

<body>
    <ul id="list">
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
    </ul>

    <script>
        var ul_list = document.getElementById('list');
        var lis = ul_list.getElementsByTagName('li');

        for (var i = 0; i < lis.length; i++) {
            lis[i].onclick = function () {
                this.style.color = 'blue';
            };
        }
    </script>
</body>
但是!批量添加事件监听会造成大量内存占用!

为什么要使用事件委托?

如例1.1,实际工作中,往往会碰到需要大量事件处理函数的场景,此时如果一个一个添加事件处理函数,过于低效,代码十分笨重,并且批量添加事件会导致监听数量太多,造成大量内存消耗。每个事件处理函数都是一个单独的引用类型,这些函数本身也会占用内存。此时,如果有一种方法可以做到既不占用内存,又能拥有大量的事件处理函数是最好的方法!

新增动态绑定事件****

下面我们一起来思考这样一个题目:

动态绑定事件:
例1.2给出一个无序列表,内部没有 li 标签,设计一个按钮,可以生成 li 标签,并且每此生成的li标签都能有一个点击字体变色的功能,给你1分钟来思考这个问题。

<body>
    <button id="btn">点击添加li标签</button>
    <ul id="list">
    </ul>

    <script>
        var ul_list = document.getElementById('list');
        var btn = document.getElementById('btn');

        btn.onclick = function () {
            var new_li = document.createElement('li'); //新增节点
            new_li.innerHTML = '列表项';
            ul_list.appendChild(new_li); //孤儿节点上树
            new_li.onclick = function () {
                this.style.color = 'blue';
            }
        }
    </script>
</body>

事件委托
由此,我们正式介绍事件委托,事件委托是利用事件的冒泡原理来实现的,事件从最内层的节点开始,然后逐步向上传播事件,

举个例子:页面上有这么一个节点树,div>ul>li;比如给最里面的li加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序li>ul>div,有这样一个机制,那么我们给最外面的div加点击事件,那么里面的ul,li做点击事件的时候,都会冒泡到最外层的div上。
```

<body>
<button id="btn">点击新增li标签</button>
<ul id="list">
<li>列表项</li>
<li>列表项</li>
<li>列表项</li>
<li>列表项</li>
<li>列表项</li>
<li>列表项</li>
</ul>

<script>
    var list = document.getElementById('list');
    var btn = document.getElementById('btn');

    list.onclick = function(e){
        //点击的子元素
        e.target.style.color = 'blue';
    }

    btn.onclick = function(){
        var new_li = document.createElement('li'); //创建新节点
        new_li.innerHTML = '新增列表项';//写入内容
        list.appendChild(new_li);//孤儿节点上树

    }
</script>

</body>

```

优势:

1,当大量类似元素需要批量添加事件监听时,使用事件委托,可以极大程度的避免资源浪费
2,当动态元素节点上树后,使用事件委托,也能让新上树的元素具有事件监听

版权声明:本文由Web学习之路发布,如需转载请注明出处。

本文链接:https://webge.net/?id=167

“请解释什么是事件委托/事件代理” 的相关文章

未命名

未命名

1、clientHeight:表示的是可视区域的高度,不包含border和滚动条;2、offsetHeight:表示的是可视区域的高度,包含了border和滚动条3、scrollHeight:表示了所有区域的高度,包含了因为滚动被隐藏的部分;4、clientTop:表示边框border的厚度,在未指...

js拖拽功能的实现

如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。 1.onmousedown:鼠标按下事件2.onmousemove:鼠标移动事件3.onmouseup:鼠标抬起事件 拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素。鼠标的移动也就是x、y坐标的变化;元素的移动就是...

异步加载js的方法

一、为什么要写异步加载①js加载本身是属于同步加载的,加载js文件会阻塞文档,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作。但是有些工具方法需要按需加载,有一些工具js文件它是不会改变页面的,用到再加载,不用不加载。 ②但是实际开发中我们只需要把script标签放在页面的最下面。...

说说你对作用域链的理解

说说你对作用域链的理解

˂a name="一、作用域" class="reference-link" href="#"˃一、作用域作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合 换句话说,作用域决定了代码区块中变量和其他资源的可见性举个例子 function myFunction() {...

Javascript如何实现继承

JavaScript想实现继承的目的:重复利用另外一个对象的属性和方法 ˂a name="一,原型链继承" class="reference-link" href="#"˃一,原型链继承让一个构造函数的原型是另一个类型的实例,那么这个构造函数new出来的实例就具有该实例的属性。当试图访问一个对象的...