javascript 事件委托 event delegation
事件委托 event delegation
一、概念:
假设我们有很多个子元素,每个元素被点击时都会触发相应事件,普通的做法是给每个子元素添加一个事件监听。
而,事件委托则是给它们的父元素添加一个事件监听器,子元素上没有任何事件监听。当子元素被点击时,这个点击事件冒泡到父元素上,然后父元素上绑定的事件监听来分析和处理这是哪个子元素被点击了。
二、例子1:一个ul及几个li:
<ul id="parent-list" style="border:1px solid black;">
<li id="post-1">Item 1</li>
<li id="post-2">Item 2</li>
<li id="post-3">Item 3</li>
<li id="post-4">Item 4</li>
<li id="post-5">Item 5</li>
<li id="post-6">Item 6</li>
</ul>
当点击li时,父元素上绑定的事件监听如何得知是哪个li被点击了?这里用到了target属性,捕获真正被点击的节点元素
<script>
(function(){
var parentEl = document.getElementById("parent-list"); parentEl.onclick = function(e){
console.log(e.target);
};
/*打印结果为
* <li id="post-6">Item 6</li>等等
* 或者是整个ul元素包括其子元素
* 所以,若要得到li元素,则需要对事件来源做筛选即:
* */ })();
</script>
接下来,对事件来源做筛选,只要li元素,其他的都不要:
修改上述对应代码为:
parentEl.onclick = function(e){
//找到被点击的li并输出其id
if(e.target && e.target.nodeName == "LI"){
console.log(e.target.id);
}
};
三、优点:
当子元素数量不固定,即:经常增删子元素时,与其给每个新增删的子元素绑定事件,不如给它们的父元素添加监听方便。
四、jquery版的事件委托:用.on()
/*jq版*/
$(function(e) {
var parentEl = $("#parent-list");
parentEl.on("click",function(e){
//找到被点击的li并输出其id
if(e.target && e.target.nodeName == "LI"){
console.log(e.target.id);
}
});
});
javascript 事件委托 event delegation的更多相关文章
- javascript事件代理(Event Delegation)
看了几篇文章,放上来供参考 司徒正美的文章,Event Delegation Made Easy --------------------------------------------------- ...
- 事件委托(event delegation)
事件委托给我带来的第一印象是,如果可以的话请尝试得经常使用它,性能好! 通过字符串拼接后,并进行DOM插入,不会复制事件,此时需要进行事件委托了!!! 优点 事件委托对于web应用程序的性能有如下几个 ...
- 事件委托(event delegation) 或叫 事件代理
比较好的介绍文章: 关于事件委托的整理 ,另附bind,live,delegate,on区别:https://www.cnblogs.com/MagicZhao123/p/5980957.html j ...
- JavaScript 事件委托的技术原理
如今的 JavaScript 技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们 ...
- JavaScript事件委托的技术原理
如今的JavaScript技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们的父 ...
- javascript事件委托机制详解
以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点 ...
- JavaScript 事件委托
JavaScript事件委托,或者叫事件代理,是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件. 借花献佛的例子(取快递): 有三个同事预计会在周一收到快递.为签收快递,有两种办法 ...
- 关于javaScript事件委托的那些事
今天是第一次写稿,还是有那么一丢丢小鸡冻...回归正题啦... 关于javaScript事件委托不得不说的那些事,为什么要使用事件委托? 我们可以这么说,假设老板要分配一项任务,首先要秘书叫A君来到办 ...
- javascript 事件委托,jq,js模拟事件
<!DOCTYPE> <html> <head> <title></title> <script src="Scripts/ ...
随机推荐
- Eclipse 导入Maven 项目报错
新建Maven项目时出错:org.apache.maven.archiver.MavenArchiver.getManifest 新建Maven项目时出错:org.apache.maven.arc ...
- 企业级hbase HA配置
1 HBase介绍HBase是一个分布式的.面向列的开源数据库,就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类 ...
- rowspan && colspan
> 跨行 <html> <body> <table width="> <tr> <th>col1</th> &l ...
- JS类、对象、方法、prototype、_proto_
案例代码: function People(name) { //对象属性 this.name = name; //对象方法 this.Introduce = function() { alert(&q ...
- Send2MyKindle使用说明文档
软件下载地址为:Send2MyKindle 功能简介 该软件主要功能为在Windows下将Kindle电子书发送到亚马逊中国网站注册的Kindle账户.整个软件界面如下图所示: 使用步骤 使用前的准备 ...
- 定制Writable类
以IntWritable为例介绍,定制writable的步骤 //继承 WritableComparable接口(继承了writable接口和comparable接口) public class In ...
- JAVA基础补漏--链表
查询慢:链表中数据不是连续的,每次查询元素,都得从头开始 增删快:链表结构,增加或删除一个数据,对链表的整体结构没有影响,所以快.
- 如何打开windows的远程桌面
WINDOWS 2003/XP 系列设置方法 右键点击[我的电脑]选择[属性],进入[系统属性]界面,点击[远程]选项卡,勾选[启用这台计算机上的远程桌面]即可. 2003/XP系统默认只允许计算机a ...
- UVA 1213 Sum of Different Primes(经典dp)
题意:选择k(k<15)个唯一质数,求出和为n(n<1121)的可能数 题解:预处理dp,dp[k][n]表示使用k个素数拼成n的总方案数 就是三重枚举,枚举k,枚举n,枚举小于n的素数 ...
- spring-boot 加入拦截器Interceptor
1.spring boot拦截器默认有 HandlerInterceptorAdapter AbstractHandlerMapping UserRoleAuthorizationIntercepto ...