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操作对象数组的实现代码
Apr 27 Javascript
javascript实现TreeView 无刷新展开的实例代码
Jul 13 Javascript
jquery如何判断某元素是否具备指定的样式
Nov 05 Javascript
node.js中的http.response.end方法使用说明
Dec 14 Javascript
jQuery源码解读之removeClass()方法分析
Feb 20 Javascript
JS组件系列之JS组件封装过程详解
Apr 28 Javascript
JavaScript之RegExp_动力节点Java学院整理
Jun 29 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
Feb 26 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
Jul 19 Javascript
Vue使用自定义指令实现拖拽行为实例分析
Jun 06 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
Sep 09 Javascript
JSONObject与JSONArray使用方法解析
Sep 28 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 extract 将数组拆分成多个变量的函数
2010/06/30 PHP
用php实现百度网盘图片直链的代码分享
2012/11/01 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
超级退弹代码
2008/07/07 Javascript
Javascript Global对象
2009/08/13 Javascript
斜45度寻路实现函数
2009/08/20 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
JS回调函数深入理解
2019/10/16 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
深入解析Python中的urllib2模块
2015/11/13 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
简单介绍Object类的功能、常用方法
2013/10/02 面试题
厨房工作人员岗位职责
2013/11/15 职场文书
婚前保证书
2014/04/29 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
2019财务转正述职报告
2019/06/27 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python