事件代理(Event Delegation)很简略,次要是为了缩小了事件监听函数的数量,通过利用事件冒泡阶段,将事件的解决搁置在父元素上实现。

来看一个例子:

HTML上创立一个id为app的div:

<div id="app"></div>

创立ul列表和li,给每一个li增加一个监听函数:

<script>    const ul = document.createElement('ul');    for (let i = 0; i < 10; i++) {        const li = document.createElement('li');        li.textContent = `This is line ${i}`;        li.addEventListener('click', () => {            console.log('Responding');        });        ul.appendChild(li);    }        document.getElementById('app').appendChild(ul);</script>

下面造成的代码成果如下:

因为每一个li都有对应的监听函数,然而监听函数都是一样的,咱们能够把函数提取进去:

<script>    const ul = document.createElement('ul');        function responding() {        console.log('Responding');    }    for (let i = 0; i < 10; i++) {        const li = document.createElement('li');        li.textContent = `This is line ${i}`;        li.addEventListener('click', responding);        ul.appendChild(li);    }     document.getElementById('app').appendChild(ul);</script>

下面的代码中,仍旧有很多事件监听函数指向同一个函数,依然没有解决问题,咱们能够通过事件代理来实现雷同的成果:

<script>    const ul = document.createElement('ul');    ul.addEventListener('click', event => {        if(event.target.nodeName.toLowerCase() === 'li'){            console.log('Responding');        }    });        for (let i = 0; i < 10; i++) {        const li = document.createElement('li');        li.textContent = `This is line ${i}`;        ul.appendChild(li);    }         document.getElementById('app').appendChild(ul);</script>

很简略,次要是在事件冒泡的阶段,指标元素不设置监听函数,而是在父元素上设置监听函数,通过event对象的target属性确定事件产生的指标元素,当指标元素统一时,父元素上的监听函数就进一步起作用。

最初

看到这里,祝贺你实现了事件代理的学习

更多优质文章能够关注公众号『鹏哥儿的Echo

生命不息,笔耕不辍

Reference

https://www.geeksforgeeks.org...