JavaScript事件的委托(代理)的用法示例详解


Posted in Javascript onFebruary 18, 2022

简介

说明

本文用示例介绍JavaScript中的事件(Event)的委托(代理)的用法。

事件委托简介

事件委托,也叫事件代理,是JavaScript中绑定事件的一种常用技巧。就是将原本需要绑定在子元素的响应事件委托给父元素或更外层元素,让外层元素担当事件监听的职务。

事件代理的原理是DOM元素的事件冒泡。

事件委托的优点

1.节省内存,减少事件的绑定

原本需要绑定在所有子元素的事件,使用事件委托之后,只需要一个事件绑定即可。

2.可以动态绑定事件,新增的子对象事件可以被已绑定的事件处理

因为新增的子对象产生的事件,最终也会冒泡到父元素,从而能够处理

示例:事件委托

需求:一个列表,点击列表元素时弹出其内容。

写法1:事件委托

只需在外层元素绑定事件即可。

<!doctype html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <title>This is title</title>
</head>
 
<body>
 
<ul id="id-ul">
    <li>我是第1个li</li>
    <li>我是第2个li</li>
    <li>我是第3个li</li>
</ul>
 
<script>
    let ul = document.getElementById('id-ul');
    ul.addEventListener("click", function (ev) {
        alert(ev.target.innerText);
    })
</script>
 
</body>
</html>

结果

JavaScript事件的委托(代理)的用法示例详解

写法2:每个子元素都绑定事件

每个子元素都绑定事件。

<!doctype html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <title>This is title</title>
</head>
 
<body>
 
<ul id="id-ul">
    <li>我是第1个li</li>
    <li>我是第2个li</li>
    <li>我是第3个li</li>
</ul>
 
<script>
    let li = document.querySelectorAll('#id-ul li');
    for (let liElement of li) {
        liElement.addEventListener("click", function (ev) {
            alert(ev.target.innerText);
        });
    }
</script>
 
</body>
</html>

结果

JavaScript事件的委托(代理)的用法示例详解

示例:新增元素

需求:每点击“生成按钮”,就生成一个子的列表元素。然后,每点击一次列表元素,会弹出其内容。

写法1:事件委托

<!doctype html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <title>This is title</title>
</head>
 
<body>
 
<ul id="id-ul">
    <li>1</li>
    <li>2</li>
</ul>
<button id="btn">click</button>
<script>
    let num = 3;
    let eUl = document.querySelector("#id-ul");
    let eButton = document.querySelector("#btn");
 
    eButton.addEventListener("click", function () {
        let newLi = document.createElement("li");
        eUl.appendChild(newLi);
        newLi.innerText = num++;
    })
    eUl.addEventListener("click",function (event) {
        alert(event.target.innerText);
    })
</script>
 
</body>
</html>

结果

JavaScript事件的委托(代理)的用法示例详解

可以看到,原有的元素和新建的元素的事件都会被处理。 

写法2:每个子元素都绑定事件

<!doctype html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <title>This is title</title>
</head>
 
<body>
 
<ul id="id-ul">
    <li>1</li>
    <li>2</li>
</ul>
<button id="btn">click</button>
<script>
    let num = 3;
    let eUl = document.querySelector("#id-ul");
    let eButton = document.querySelector("#btn");
    let eLi = document.querySelectorAll("#id-ul li");
 
    eButton.addEventListener("click", function () {
        let newLi = document.createElement("li");
        eUl.appendChild(newLi);
        newLi.innerText = num++;
    })
 
    for (let eLiElement of eLi) {
        eLiElement.addEventListener("click",function (event) {
            alert(event.target.innerText);
        })
    }
 
</script>
 
</body>
</html>

结果

JavaScript事件的委托(代理)的用法示例详解

可以看到:原有的元素的点击事件会被处理,但新加入的不会被处理。 

到此这篇关于JavaScript事件的委托(代理)的用法示例详解的文章就介绍到这了,更多相关JavaScript事件委托内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js实现iframe动态调整高度的代码
Jan 06 Javascript
jQuery中first()方法用法实例
Jan 06 Javascript
JavaScript入门教程之引用类型
May 04 Javascript
AngularJS Bootstrap详细介绍及实例代码
Jul 28 Javascript
ionic实现带字的toggle滑动组件
Aug 27 Javascript
js获取当前页的URL与window.location.href简单方法
Feb 13 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
Jul 07 Javascript
webstorm添加*.vue文件支持
May 08 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
Aug 08 jQuery
小程序获取当前位置加搜索附近热门小区及商区的方法
Apr 08 Javascript
jquery-ui 进度条功能示例【测试可用】
Jul 25 jQuery
了不起的11个JavaScript代码重构最佳实践小结
Jan 11 Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 #Vue.js
vue3获取当前路由地址
Feb 18 #Vue.js
如何利用React实现图片识别App
JavaScript展开运算符和剩余运算符的区别详解
Feb 18 #Javascript
微信小程序中使用vant框架的具体步骤
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 #Vue.js
微信小程序中wxs文件的一些妙用分享
Feb 18 #Javascript
You might like
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
offsetParent 算法分析
2010/04/05 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
JS函数基本定义与用法示例
2020/01/15 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
python下如何让web元素的生成更简单的分析
2008/07/17 Python
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
Python函数嵌套实例
2014/09/23 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
python实现决策树分类(2)
2018/08/30 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
购买大码女装:Lane Bryant
2016/09/07 全球购物
境外导游求职信
2014/02/27 职场文书
新年主持词
2014/03/27 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
初中作文评语集锦
2014/12/25 职场文书
Python max函数中key的用法及原理解析
2021/06/26 Python
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python
深入理解pytorch库的dockerfile
2022/06/10 Python