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下给元素添加事件的方法与代码
Aug 13 Javascript
JavaScript中的Screen屏幕对象
Jan 16 Javascript
JavaScript在IE中“意外地调用了方法或属性访问”
Nov 19 Javascript
Select标签下拉列表二级联动级联实例代码
Feb 07 Javascript
[原创]推荐10款最热门jQuery UI框架
Aug 19 Javascript
jQuery中animate()方法用法实例
Dec 24 Javascript
JQuery的ON()方法支持的所有事件罗列
Feb 28 Javascript
javascript实现3D变换的立体圆圈实例
Aug 06 Javascript
基于JavaScript实现弹出框效果
Feb 19 Javascript
angularJs 表格添加删除修改查询方法
Feb 27 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
Apr 22 Javascript
Vue实现多页签组件
Jan 14 Vue.js
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实现水仙花数示例分享
2014/04/03 PHP
PHP中的socket_read和socket_recv区别详解
2015/02/09 PHP
php验证手机号码
2015/11/11 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
2016/03/18 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
python的re模块应用实例
2014/09/26 Python
python实现调用其他python脚本的方法
2014/10/05 Python
Python下rrdtool模块的基本使用方法
2015/11/13 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
PyQt5实现简易电子词典
2019/06/25 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
Matplotlib绘制雷达图和三维图的示例代码
2020/01/07 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
python db类用法说明
2020/07/07 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
servlet面试题
2012/08/20 面试题
美术师范毕业生自荐信
2013/11/16 职场文书
安全大检查实施方案
2014/02/22 职场文书
设计师求职信模板
2014/05/06 职场文书
python和anaconda的区别
2022/05/06 Python