js中的事件委派
在介绍JS中事件委派之前先来看看一个简单的需求:为每一个超链接绑定一个单击响应函数并在控制台打印一句话,内容是:” a 标签的单击响应函数“。下面是这个需求的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
// 需求:为每一个超链接绑定一个单机响应函数
window.onload = function() {
// 获取页面中所有的 a 标签
var allA = document.getElementsByTagName('a');
for(var i = 0; i < allA.length; i++) {
allA[i].onclick = function() {
console.log('我是 a 的单击响应函数');
}
}
}
</script>
</head>
<body>
<ul id="ul">
<li><a href="javascript:;">超链接1</a></li>
<li><a href="javascript:;">超链接2</a></li>
<li><a href="javascript:;">超链接3</a></li>
</ul>
</body>
</html>
在浏览器中打开上部分代码,点击相应的超链接, 都可以在控制台打印“我是 a 的单击响应函数”。感觉好像是够用了,哈哈哈哈,其实还没完。
在此基础上升级,现在要做的是点击添加按钮追加一个 ul 的子元素 li。被新添加进去的 li 也能触发循环绑定的事件方法,下面是具体代码:
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
window.onload = function () {
var ul = document.getElementById('ul');
var allA = document.getElementsByTagName('a');
var btn = document.getElementById('btn');
btn.onclick = function () {
// 创建一个li标签
var li = document.createElement('li');
li.innerHTML = '<a href="javascript:;" class="link">新添加的超链接</a>';
ul.appendChild(li);
}
for (var i = 0; i < allA.length; i++) {
allA[i].onclick = function () {
console.log('我是 a 的单击响应函数');
}
}
}
</script>
</head> <body>
<button id="btn">点击添加</button>
<ul id="ul">
<li><a href="javascript:;">超链接1</a></li>
<li><a href="javascript:;">超链接2</a></li>
<li><a href="javascript:;">超链接3</a></li>
</ul>
</body> </html>
在浏览器打开,点击添加一个子元素,可以看到之前循环绑定事件的函数不管用了,被新添加的元素不会触发 onclick 事件方法,不能在控制台打印 “我是a标签的响应函数 ”,这里就涉及到事件委派了,先来看看事件委派的原理。
事件委派:将事件统一绑定给元素共同的祖先元素(后代元素事件触发时,通过冒泡,通过祖先元素的响应函数来处理事件),这样可以只绑定一次,即可应用到多个元素上。事件的委派利用了冒泡,通过委派可以减少事件绑定的次数,提高程序的性能event中的target表示的触发事件的对象 ,使用它对触发事件的元素进行判断。
我现在的需求是:只需要绑定一次事件并可以应用到多个元素上,即使元素是后添加的,也能触发这个事件方法。具体代码如下:
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head> <body>
<!-- 需求:为每一个li绑定一个函数 -->
<button id="btn">点击添加超链接</button>
<ul id="ul" style="background-color: pink">
<li><a href="javascript:;" class="link">超链接1</a></li>
<li><a href="javascript:;" class="link">超链接2</a></li>
<li><a href="javascript:;" class="link">超链接3</a></li>
</ul>
<script>
window.onload = function () {
var ul = document.getElementById('ul');
var btn = document.getElementById('btn');
btn.onclick = function () {
// 创建一个li标签
var li = document.createElement('li');
li.innerHTML = '<a href="javascript:;" class="link">新添加的超链接</a>';
ul.appendChild(li);
}
var allA = document.getElementsByTagName('a'); ul.onclick = function (event) {
if (event.target.className == 'link') {
alert(`我是a`);
}
} }
</script>
</body> </html>
js中的事件委派的更多相关文章
- 怎么理解js中的事件委托
怎么理解js中的事件委托 时间 2015-01-15 00:59:59 SegmentFault 原文 http://segmentfault.com/blog/sunchengli/119000 ...
- js中冒泡事件和捕获事件
js中冒泡事件和捕获事件: 冒泡事件:冒泡事件是从里向外,即是从被绑定元素开始一直向外到达页面的所有祖先元素都会被触发,这 一过程被称为事件冒泡.这个事件从原始元素开始一直冒泡到DOM树的最上层 捕获 ...
- 看懂此文,不再困惑于 JS 中的事件设计
看懂此文,不再困惑于 JS 中的事件设计 今天刚在关注的微信公众号看到的文章,关于JS事件的,写的很详细也很容易理解,相关的知识点都有总结到,看完就有种很舒畅的感觉,该串起来的知识点都串起来了.反正一 ...
- js中冒泡事件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- DOM 以及JS中的事件
[DOM树节点] DOM节点分为三大节点:元素节点,文本节点,属性节点. 文本节点,属性节点为元素节点的两个子节点通过getElment系列方法,可以去到元素节点 [查看节点] 1 document. ...
- 从零开始的JS生活(二)——BOM、DOM与JS中的事件
上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举 ...
- js中的事件,内置对象,正则表达式
[JS中的事件分类] 1.鼠标事件: click/dbclick/mouseover/mouseout/mousemove/mousedown/mouseup 2.键盘事件: keydown: 键盘按 ...
- JS中的事件以及DOM 操作
[DOM树节点] DOM节点分为三大节点:元素节点,文本节点,属性节点. 文本节点,属性节点为元素节点的两个子节点通过getElment系列方法,可以去到元素节点 [查看节点] 1 document. ...
- JS中的事件&对象
一.JS中的事件 (一)JS中的事件分类 1.鼠标事件 click/dblclick/onmouseover/onmouseout 2.HTML事件 onload/onscroll/onsubmit/ ...
随机推荐
- 【BZOJ1227】[SDOI2009]虔诚的墓主人
E. 虔诚的墓主人 题目描述 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前 ...
- Shell echo 命令
Shell 的echo 指令与PHP的echo指令类似,都是用于字符串的输出.命令格式: echo string 您可以使用echo实现更复杂的输出格式控制. 1.显示普通字符串: echo &quo ...
- JVM参数详细列表
-client :设置JVM使用client模式,特点启动较快(神机不明显(I5/8G/SSD)) -server :设置JVM使用server模式.64位JDK默认启动该模式 -agentlib:l ...
- 解决 vs 出现Error MC3000 给定编码中的字符无效
在 xaml 写中文注释,发现编译失败 Error MC3000 给定编码中的字符无效 我的 xaml 写了一句代码 <Grid> <!--林德熙--> </Grid&g ...
- Getting started with the basics of programming exercises_1
1.编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替 使用if 结构: #include<stdio.h> #define NONBLANK 'a'; // repal ...
- jq获取单选框、复选框、下拉菜单的值
1.<input type="radio" name="testradio" value="jquery获取radio的值" /> ...
- ccf-201703-4-地铁修建
二分+并查集 发现了一个很奇怪的问题,二分的上界设置错了,结果是运行错误...只有95分.后来改了上界就100了,百思不得其解 #include<cstdio> #include<c ...
- supersocket实现你的命令
现在, 如果你有一个命令行协议的服务器实例 "IronPythonServer", 而且我们要用 Python 创建一个 "ADD" 命令用于让两个整数相加,然 ...
- 【DCN】端口与地址绑定技术
端口与地址绑定技术 与AM技术不同之处在于,AM端口下绑定的MAC或IP能够通信,不限制绑定的MAC在其它接口下通信. 开启MAC-CPU学习模式 mac-address-learning c ...
- lrj 9.4.1 最长上升子序列 LIS
p275 d(i)是以Ai为结尾的最长上升子序列的长度 <算法竞赛入门经典-训练指南>p62 问题6 提供了一种优化到 O(nlogn)的方法. 文本中用g(i)表示d值为i的最小状态编号 ...