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 相关文章推荐
jQuery源码分析-01总体架构分析
Nov 14 Javascript
关于图片的预加载过程中隐藏未知的
Dec 19 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
Aug 14 Javascript
js中事件的处理与浏览器对象示例介绍
Nov 29 Javascript
js数组操作常用方法
May 08 Javascript
js实现touch移动触屏滑动事件
Apr 17 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
May 10 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
Aug 05 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
Nov 20 Javascript
微信小程序-获得用户输入内容
Feb 13 Javascript
jQuery弹出窗口简单实现代码
Mar 09 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
Nov 20 jQuery
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开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
Python八皇后问题解答过程详解
2019/07/29 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
python文字转语音实现过程解析
2019/11/12 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
Python短信轰炸的代码
2020/03/25 Python
python轮询机制控制led实例
2020/05/03 Python
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
共产党员公开承诺书范文
2014/03/28 职场文书
学校中秋节活动总结
2015/03/23 职场文书
小学德育工作总结2015
2015/05/12 职场文书
高中团支书竞选稿
2015/11/21 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers