JS冒泡事件与事件捕获实例详解


Posted in Javascript onNovember 25, 2016

本文实例分析了JS冒泡事件与事件捕获。分享给大家供大家参考,具体如下:

案例

<!DOCTYPE html>
<html>
<head>
  <title>冒泡事件</title>
  <script type="text/javascript">
    window.onload = function(){
      window.onclick = function(){
        alert("Window"); // 顶级
      };
      document.onclick = function(){
        alert("Document"); // 次顶级
      };
      document.documentElement.onclick = function(){
        alert("Html"); // 次次顶级
      };
      document.body.onclick = function(){
        alert("Body"); // 次次次顶级
      };
      document.getElementById("myDiv").onclick = function(){
        alert("Div"); // 最先执行,并且会传递到上一层。点击两次,则按顺序执行两次。如果上级也有点击事件的话
      };
    }
  </script>
</head>
<body>
  <div id="myDiv">点我</div>
</body>
</html>

小结

1.点击myDiv。依次是Div-Body-Html-Document-Window

2.点击其他空白地方。依次是Html-Document-Window

3.连续点击两次,会按顺序执行两次

4.冒泡的前提是,父级也定义了相应的事件

再看一个更复杂的例子

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>事件捕捉</title>
  <script type="text/javascript">
    window.onload = function(){
      window.addEventListener("click", function(){
        alert("Window - true");
      }, true); // true - 事件句柄在捕获阶段执行 ,false- false- 默认。事件句柄在冒泡阶段执行
      document.addEventListener("click", function(){
        alert("Document - true");
      }, true);
      document.documentElement.addEventListener("click", function(){
        alert("Html - true");
      }, true);
      document.body.addEventListener("click", function(){
        alert("Body - true");
      }, true);
      document.getElementById("myDiv").addEventListener("click", function(){
        alert("Div - true");
      }, true);
      window.addEventListener("click", function(){
        alert("Window - false");
      }, false); // true - 事件句柄在捕获阶段执行 ,false- false- 默认。事件句柄在冒泡阶段执行
      document.addEventListener("click", function(){
        alert("Document - false");
      }, false);
      document.documentElement.addEventListener("click", function(){
        alert("Html - false");
      }, false);
      document.body.addEventListener("click", function(){
        alert("Body - false");
      }, false);
      document.getElementById("myDiv").addEventListener("click", function(){
        alert("Div - false");
      }, false);
      window.onclick = function(){
        alert("Window - click"); // 顶级
      };
      document.onclick = function(){
        alert("Document - click"); // 次顶级
      };
      document.documentElement.onclick = function(){
        alert("Html - click"); // 次次顶级
      };
      document.body.onclick = function(){
        alert("Body - click"); // 次次次顶级
      };
      document.getElementById("myDiv").onclick = function(){
        alert("Div - click"); // 最先执行,并且会传递到上一层。点击两次,则按顺序执行两次。如果上级也有点击事件的话
      };
    }
  </script>
</head>
<body>
  <div id="myDiv">点我</div>
</body>
</html>

小结

1.点击的执行结果是

Window - true

Document - true

Html - true

Body - true

Div - true

Div - false

Div - click

Body - false

Body - click

Html - false

Html - click

Document - false

Document - click

Window - false

Window - click

2.顺序与js代码顺序无关

3.就算没有定义点击事件,一样可以捕获点击事件,只要点击到,就能捕获到

再次改造,阻止冒泡

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>事件捕捉</title>
  <script type="text/javascript">
    window.onload = function(){
      document.addEventListener("click", function(){
        alert("Document - true");
      }, true);
      window.addEventListener("click", function(){
        alert("Window - true");
      }, true); // true - 事件句柄在捕获阶段执行 ,false- false- 默认。事件句柄在冒泡阶段执行
      document.documentElement.addEventListener("click", function(){
        alert("Html - true");
      }, true);
      document.body.addEventListener("click", function(){
        alert("Body - true");
      }, true);
      document.getElementById("myDiv").addEventListener("click", function(){
        alert("Div - true");
      }, true);
      window.addEventListener("click", function(){
        alert("Window - false");
      }, false); // true - 事件句柄在捕获阶段执行 ,false- false- 默认。事件句柄在冒泡阶段执行
      document.addEventListener("click", function(){
        alert("Document - false");
      }, false);
      document.documentElement.addEventListener("click", function(){
        alert("Html - false");
      }, false);
      document.body.addEventListener("click", function(){
        alert("Body - false");
      }, false);
      document.getElementById("myDiv").addEventListener("click", function(){
        alert("Div - false");
      }, false);
      window.onclick = function(){
        alert("Window - click"); // 顶级
      };
      document.onclick = function(){
        alert("Document - click"); // 次顶级
      };
      document.documentElement.onclick = function(){
        alert("Html - click"); // 次次顶级
      };
      document.body.onclick = function(){
        alert("Body - click"); // 次次次顶级
      };
      document.getElementById("myDiv").onclick = function(){
        alert("Div - click"); // 最先执行,并且会传递到上一层。点击两次,则按顺序执行两次。如果上级也有点击事件的话
        event.stopPropagation(); // 阻止冒泡
      };
    }
  </script>
</head>
<body>
  <div id="myDiv">点我</div>
</body>
</html>

小结

Window - true

Document - true

Html - true

Body - true

Div - true

Div - false

Div - click

终止了,没有后续的内容了

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
使用jQuery操作Cookies的实现代码
Oct 09 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
一不小心就做错的JS闭包面试题
Nov 25 Javascript
Vue.js学习之过滤器详解
Jan 22 Javascript
JavaScript获取URL参数的方法之一
Mar 24 Javascript
微信小程序实现带刻度尺滑块功能
Mar 29 Javascript
详解vue项目首页加载速度优化
Oct 18 Javascript
微信小程序左右滑动的实现代码
Dec 15 Javascript
JS脚本加载后执行相应回调函数的操作方法
Feb 28 Javascript
js实现继承的方法及优缺点总结
May 08 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
Jul 24 Javascript
js前端面试常见浏览器缓存强缓存及协商缓存实例
Jun 21 Javascript
js事件源window.event.srcElement兼容性写法(详解)
Nov 25 #Javascript
使用JS读取XML文件的方法
Nov 25 #Javascript
JS比较两个数值的大小实例
Nov 25 #Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
Nov 25 #Javascript
js移动焦点到最后位置的简单方法
Nov 25 #Javascript
详解JS几种变量交换方式以及性能分析对比
Nov 25 #Javascript
深入浅析Vue组件开发
Nov 25 #Javascript
You might like
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
js自定义事件代码说明
2011/01/31 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
js登录弹出层特效
2014/03/07 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
Python3常见函数range()用法详解
2019/12/30 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
师范生自荐信
2013/10/27 职场文书
党员年终民主评议的自我评价
2013/11/05 职场文书
总经理秘书的岗位职责
2013/12/27 职场文书
中学生差生评语
2014/01/30 职场文书
小学生元旦感言
2014/02/26 职场文书
奶茶店创业计划书
2014/08/14 职场文书
工会工作先进事迹
2014/08/18 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android