Dom基础(三):事件冒泡,事件委托(事件代理)和事件捕获
javascript中的addEventListener(事件名,回调,布尔)
其中第三个参数默认为false-事件冒泡,true为事件捕获
二者区别:
- 事件冒泡:目标元素事件先触发,然后父元素事件触发
- 事件捕获:父元素事件先触发,然后目标元素事件触发
1 <body id="body">
2 <div id="div1">
3 <a href="#">a1</a>
4 <a href="#">a2</a>
5 <a href="#">a3</a>
6 <a href="#">a4</a>
7 <button id="btn1">点击添加一个a标签</button>
8 </div>
9 </body>
10 <script>
11 //通用绑定事件
12 function bindEvent(elem, type, fn) {
13 elem.addEventListener(type, fn)
14 }
15
16 //事件冒泡
17 const div1 = document.getElementById("div1")
18 bindEvent(div1, 'click', event=>{ //事件冒泡,如果你点击是button或者a 则div1绑定的回调也会触发
19 console.log(event.target)
20 alert('这是冒泡')
21 })
22 const body = document.getElementById("body")
23 bindEvent(body, 'click', event=>{ //事件冒泡,如果你点击是button或者a 则body绑定的回调也会触发
24 console.log(event.target)
25 alert('这是body')
26 })
27 </script>
事件委托是利用事件冒泡原理,把事件监听绑定在元素的父级上。当元素被点击时,父级上绑定的点击事件就会被触发,事件触发函数里通过判断 e.target 上的 data-name 或 class 等标识来执行不同的逻辑。
优点:可以减少浏览器内存占用,提高代码整洁度
<body id="body">
<div id="div1">
<a href="#">a1</a>
<a href="#">a2</a>
<a href="#">a3</a>
<a href="#">a4</a>
<button id="btn1">点击添加一个a标签</button>
</div>
</body>
<script>
//通用绑定事件
function bindEvent(elem, type, fn) {
elem.addEventListener(type, fn)
} //事件代理
const div1 = document.getElementById("div1")
bindEvent(div1, 'click', event=>{ //事件冒泡,可以指定父元素委托某个子元素触发父元素绑定的回调
event.preventDefault();
let target = event.target
if(target.nodeName=='A') {
console.log('这是div')
}
})
</script>
阻止事件冒泡和默认事件
event.preventDefault()可以阻止如a链接等默认行为
event.stopPropagation()可以阻止事件继续冒泡
手写一个事件函数
1 //通用绑定事件
2 function bindEvent(elem, type, selector, fn) {
3 //如果fn为null则证明这是普通事件
4 if(fn == null) {
5 fn = selector
6 selector = null
7 }
8 elem.addEventListener(type, event =>{
9 const target = event.target
10 //如果selector存在证明他是事件委托
11 if(selector) {
12 if(target.matches(selector)) {
13 fn.call(target, event)
14 }
15 }else {
16 fn.call(target, event)
17 }
18 })
19 }
Dom基础(三):事件冒泡,事件委托(事件代理)和事件捕获的更多相关文章
- jquery 事件冒泡的介绍以及如何阻止事件冒泡
在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级 ...
- 解决内部元素onMouseOver/onMouseOut事件冒泡触发父元素的相应事件
前阵子为BS项目模板做了一个左侧滑动信息栏,效果类似于windows状态栏的自动隐藏效果,鼠标移进滑出,鼠标移出隐藏,浮动时不占用空间,也可以固定住占一块位置.做的过程中遇到一个问题,鼠标在信息栏内部 ...
- js之阻止事件冒泡(待修改)和阻止默认事件
阻止默认事件(event.stopPropagation()): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...
- Js之Dom学习-三种获取页面元素的方式、事件、innerText和innerHTML的异同
一.三种获取页面元素的方式: getElementById:通过id来获取 <body> <input type="text" value="请输入一个 ...
- vue中click阻止事件冒泡,防止触发另一个事件
在使用el-upload组件时,在其中放置了一个删除按钮的图片. 当点击图片,本想只删除上传的视频,但是意外触发了el-upload中的事件 解决办法:用stop,结果只删除当前预览,不触发上传事件. ...
- Asp.Net 利用反射获得委托和事件以及创建委托实例和添加事件处理程序
子程序定义: public delegate void CurrentControlListenEvent(string uniqueID, string way = null); public ev ...
- DOM事件机制(事件捕获和事件冒泡和事件委托)
内容: 1.事件复习 2.事件冒泡与事件捕获 3.事件委托 1.事件复习 (1)事件 事件是用来处理响应的一个机制,这个响应可以来自于用户(点击, 鼠标移动, 滚动), 也可以来自于浏览器 下面的链接 ...
- JS中的事件、事件冒泡和事件捕获、事件委托
https://www.cnblogs.com/diver-blogs/p/5649270.html https://www.cnblogs.com/Chen-XiaoJun/p/6210987.ht ...
- javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。
首先,弄明白js 当中,什么是事件,事件模型在js中是如何设计的.什么是事件冒泡? 什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层.这时,从最底层冒出了一个气泡,气泡会 ...
- JavaScript和JQuery中的事件\委托链\事件冒泡\事件捕获,兼容所有浏览器
有做过北大青鸟培训讲师经验的我,如今在一家公司做技术部经理的职位,发现有很多程序员的基本功相当糟糕,在组织企业内部培训时讲解了一些案例,总结了一些经典代码,希望对自己和有需要的人提供一些帮助吧: Ja ...
随机推荐
- 安装配置Snort和barnyard2
1.安装依赖包 yum install –y gcc flex bison zlib* libpcap* tcpdump gcc-c++ zlib* libdnet libdnet-devel pcr ...
- redis主从复制和哨兵机制
redis主从复制和哨兵机制 技术标签: redis 1.redis主从复制(master/slave模式) 主数据库可以进行读写操作,当写操作导致数据发生变化时会自动将数据同步给从数据库.而一般情况 ...
- 实验:zk master宕机后,临时节点在新的master上是否存在,结果出人意料
一.实验 实验说明:3台zk集群,主要验证:master上的客户端,在master上建立临时节点,当master宕机时,其他follower选为主后,临时节点是否存在. 主要是通过此来验证,基于zk的 ...
- 如何进行Hibernate的性能优化?
大体上,对于HIBERNATE性能调优的主要考虑点如下: l 数据库设计调整 l HQL优化 l API的正确使用(如根据不同的业务类型选用不同的集合及查询API) l 主配置参数(日志,查询缓存,f ...
- Oracle的数据优化(经常被问到)?
以Oracle数据库举例:(a-G要求掌握,H一般为DBA操作,了解就可以了) a. 建库:已知将保存海量数据的时候,因为Oracle是通过用户来管理数据的, 第一步我们先建一个tableaspace ...
- Dubbo 如何优雅停机?
Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用 kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才 会执行.
- resin服务之二----整合resin+Apache服务
整合resin+Apache服务 1.为什么要整合Apache和resin? a. 早期的resin,tomcat对httpd服务支持不好. b. tomcat,resin对rewrite,expi ...
- idea中Git的配置和Github上推拉项目
1.去官网下载Git,并且安装它.安装步骤较为简单,此处就不再赘述. 2.在idea中配置Git信息 Git路径就是你电脑中安装Git的位置,找到git.exe文件(正常情况下,idea都会自动给你匹 ...
- 领域驱动(DDD)设计和开发实战
领域驱动设计(DDD)的中心内容是如何将业务领域概念映射到软件工件中.大部分关于此主题的著作和文章都以 Eric Evans 的书<领域驱动设计>为基础,主要从概念和设计的角度探讨领域建模 ...
- Quartz高可用定时任务快速上手
定时任务使用指南 如果你想做定时任务,有高可用方面的需求,或者仅仅想入门快,上手简单,那么选用它准没错. 定时任务模块是对Quartz框架进一步封装,使用更加简洁. 1.引入依赖 <depend ...