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中格式化日期时间型数据函数代码
Nov 08 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
May 27 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
Aug 23 Javascript
javascript中判断json的方法总结
Aug 27 Javascript
微信小程序 教程之模块化
Oct 17 Javascript
echarts整合多个类似option的方法实例
Jul 10 Javascript
微信小程序tabbar底部导航
Nov 05 Javascript
详解用场景去理解函数柯里化(入门篇)
Apr 11 Javascript
Jquery动态列功能完整实例
Aug 30 jQuery
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
Nov 06 Javascript
Vue组件间数据传递的方式(3种)
Jul 13 Javascript
vue-amap根据地址回显地图并mark的操作
Nov 03 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
PHP number_format() 函数定义和用法
2012/06/01 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
php读取大文件示例分享(文件操作类)
2014/04/13 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
2015/05/12 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
javascript数组定义的几种方法
2017/10/06 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
用js编写留言板
2020/03/17 Javascript
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
如何提高SQL Server的安全性
2016/07/25 面试题
高二物理教学反思
2014/02/08 职场文书
生活部的活动方案
2014/08/19 职场文书
给校长的一封检讨书
2014/09/20 职场文书
3.15消费者权益日活动总结
2015/02/09 职场文书
三下乡个人总结
2015/03/04 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
2015年营业员工作总结
2015/04/23 职场文书
亮剑观后感600字
2015/06/05 职场文书
微信小程序实现轮播图指示器
2022/06/25 Javascript