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 相关文章推荐
解析javascript 数组以及json元素的添加删除
Jun 26 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
Apr 04 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
Apr 10 Javascript
jquery属性,遍历,HTML操作方法详解
Sep 17 Javascript
JavaScript中绑定事件的三种方式及去除绑定
Nov 05 Javascript
简单实现jquery焦点图
Dec 12 Javascript
AngularJS折叠菜单实现方法示例
May 18 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
Aug 07 Javascript
vue父子组件的嵌套的示例代码
Sep 08 Javascript
layui实现点击按钮给table添加一行
Aug 10 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
Mar 13 Javascript
JS精确判断数据类型代码实例
Dec 18 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模板中出现空行解决方法
2011/03/08 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
jquery、js操作checkbox全选反选
2014/03/12 Javascript
cookie的secure属性详解
2015/04/08 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
详解webpack介绍&amp;安装&amp;常用命令
2017/06/29 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
Python使用MD5加密字符串示例
2014/08/22 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
python命令 -u参数用法解析
2019/10/24 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
pandas apply多线程实现代码
2020/08/17 Python
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
急诊科护士自我鉴定
2013/10/14 职场文书
精细化工应届生求职信
2013/11/17 职场文书
单位办理社保介绍信
2014/01/10 职场文书
2015年敬老月活动总结
2015/03/27 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
汽车修理厂管理制度
2015/08/05 职场文书
2016年学校安全教育月活动总结
2016/04/06 职场文书