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 相关文章推荐
javascript AutoScroller 函数类
May 29 Javascript
写给想学习Javascript的朋友一点学习经验小结
Nov 23 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
Mar 07 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
May 10 Javascript
JS检测图片大小的实例
Aug 21 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
Aug 15 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
Sep 01 Javascript
jquery插件pagination实现无刷新ajax分页
Sep 30 Javascript
Bootstrap基本样式学习笔记之表单(3)
Dec 07 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
Dec 08 Javascript
17道题让你彻底理解JS中的类型转换
Aug 08 Javascript
基于html+css+js实现简易计算器代码实例
Feb 28 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
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
php post换行的方法
2020/02/03 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
Python实现识别手写数字大纲
2018/01/29 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
HTML5 直播疯狂点赞动画实现代码 附源码
2020/04/14 HTML / CSS
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
会展中心部门工作职责
2013/11/27 职场文书
经贸日语专业个人求职信
2013/12/13 职场文书
超市总经理岗位职责
2014/02/02 职场文书
班级课外活动总结
2014/07/09 职场文书
司机岗位职责说明书
2014/07/29 职场文书
文案策划岗位职责
2015/02/11 职场文书
赤壁观后感(2)
2015/06/15 职场文书
mysql事务对效率的影响分析总结
2021/10/24 MySQL