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/ ...
随机推荐
- Spring AOP 的实现方式(以日志管理为例)
一.AOP的概念 AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充,流行的AOP框架有Sping AOP.Aspect ...
- python替换一个文件里面的特定内容
f = open("1.txt", "r", encoding="utf-8") f_new = open("2.txt" ...
- 微服务-使用Redis实现分布式缓存
在单体中对于key信息和用户信息是放在内存中放的,通过session进行管理. 微服务是要放在分布式缓存中,以实现服务的无状态化. @Autowired private StringRedisTemp ...
- Eclipse配置多个jdk
Eclipse配置多个jdk 步骤: 1,打开windows > Preferences: 2,点击“Add”,新增jdk,选择“Standard VM”: 3,下一步,选择对应版本的jer: ...
- cordova 插件
1.移动端WebApp开发,如何实现状态栏沉浸式效果? cordova-plugin-fullscreen 2. cordova热更新插件-不发布应用市场动态更新APP源码 https://githu ...
- 利用python获取nginx服务的ip以及流量统计信息
#!/usr/bin/python #coding=utf8 log_file = "/usr/local/nginx/logs/access.log" with open(log ...
- 20145327高晨 实验一 "Java开发环境的熟悉"
实验一 Java开发环境的熟悉(Linux + Eclipse) (Windows + IDEA) 实验内容:实现Fibonacci数列功能,并进行测试. 实验步骤: Fibonacci数列(斐波拉契 ...
- ECU
ECU(Electronic Control Unit)电子控制单元,又称“行车电脑”.“车载电脑”等.从用途上讲则是汽车专用微机控制器,也叫汽车专用单片机.它和普通的单片机一样,由微处理器(CPU) ...
- php数据库乱码
很多情况下,在本地测试是没有问题的.但是一上线,问题就增加了,主要还是代码方面不够全面.现在基本没人用php的了,权当学习 mysql_query("set names 'utf8'&quo ...
- vue2.0--vue-router路由
一.vue-router如何进行参数传递 1.name $route.name 通过在路由router/index.js中配置路由时定义的name属性来传递 ① 有一个页面components/he ...