事件冒泡与事件捕获

1、冒泡:addEventListener("click",fn,false)或者addEventListener("click",fn);捕获:addEventListener("click",fn,true)。

2、区别:冒泡是从触发该事件的目标节点一层一层往上将同种类型的事件触发;捕获是从触发该事件的目标节点最高一级的父节点开始将同种类型事件往下一层一层触发直到事件的目标的节点。

结合上图可以看出,ele1与ele2都通过addEventListener注册了点击事件的话

(1)如果参数是true的话,在点击了ele2的时候,会首先进入捕获阶段,因为参数是true,捕获阶段会触发,那么首先会响应的是ele1的点击事件,随后是ele2,因为是false所以不会触发冒泡阶段

(2)如果参数是false的话,在点击了ele2的时候,虽然会首先进入捕获阶段,但是不会有任何响应,在进入随后的冒泡阶段则会首先响应ele2的点击事件,随后才是ele1

冒泡的顺序

IE6:div=》body=》html=》document

其他:div=》body=》html=》document=》window

不支持冒泡的事件:

blur、focus、load、unload、onmouseenter、onmouseleave

target与bubbles

target:触发此事件的目标

bubbles:此事件是否支持冒泡

target兼容问题:

//IE678支持event.srcElement(事件源)
//火狐谷歌IE9以上支持event.target(事件源)
//兼容写法获取元素ID:
var event = event || window.event;
var targetId = event.target ? event.target.id : event.srcElement.id;

点击最小的div,冒泡和捕获返回结果不同

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box1 {
width: 400px;
height: 400px;
background-color: red;
} .box2 {
width: 200px;
height: 200px;
background-color: yellow;
} .box3 {
width: 100px;
height: 100px;
background-color: green;
}
</style>
</head>
<body>
<div class="box1">
<div class="box2">
<div class="box3"></div>
</div>
</div>
<script>
var box1 = document.getElementsByTagName("div")[0];
var box2 = box1.children[0];
var box3 = box2.children[0];
box1.addEventListener("click", function () {
console.log("box1");
}, false);
box2.addEventListener("click", function () {
console.log("box2");
}, false);
box3.addEventListener("click", function () {
console.log("box3");
}, false);
</script>
</body>
</html>
最后结果:
box3
box2
box1
<script>
var box1 = document.getElementsByTagName("div")[0];
var box2 = box1.children[0];
var box3 = box2.children[0];
box1.addEventListener("click", function () {
console.log("box1");
}, true);
box2.addEventListener("click", function () {
console.log("box2");
}, true);
box3.addEventListener("click", function () {
console.log("box3");
}, true);
</script>
最后结果:
box1
box2
box3

 阻止冒泡

//火狐谷歌IE11支持event.stopPropagation
//IE10以下则是使用event.cancelBubble = true
<script>
box.onclick = function (event) {
var event = event || window.event;
console.log(event.target);
if (event && event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelBubble = true;
}
}
</script>

最新文章

  1. ADO.NET Entity Framework
  2. 在Springmvc中获取properties属性
  3. 移动端-js触摸事件
  4. linux 中的 tar 解压
  5. 自动备份sqlexpress 数据库脚本
  6. Oracle redo 日志切换时间频率
  7. 性能测试开源小工具——http_load介绍
  8. webform在页面生成的代码与事件回传
  9. 团队作业8----第二次项目冲刺(beta阶段)5.21
  10. Ajax 传包含集合的JSON
  11. C#学习笔记:预处理指令
  12. .net MVC中使用angularJs刷新页面数据列表
  13. MesureDeviceWebServiceDAS
  14. JAVA泛型方法与类型限定
  15. bzoj 3261 最大异或和 可持久化字典树(01树)
  16. 登陆界面背景动画的css样式
  17. 根据操作系统进程号,查找sql语句
  18. zabbix主机自动发现
  19. 使用MailKit收发邮件
  20. 面试题思考:Stack和Heap的区别

热门文章

  1. git常见操作---由简入深
  2. php获取代理服务器真实内网IP方法
  3. Bellman_ford 算法 Currency Exchange POJ1860
  4. 武大OJ 574. K-th smallest
  5. Ubuntu 16.04开机进入命令行(tty1)+分辨率调节+字体颜色设置+中文乱码解决(解决虚拟终端Ctrl+Alt+F1分辨率太大)
  6. Docker创建PHP镜像
  7. LeetCode 438. Find All Anagrams in a String (在字符串中找到所有的变位词)
  8. ios17--自定义控件2改进
  9. uboot的GPIO驱动分析--基于全志的A10芯片【转】
  10. [模板]平衡树splay