js点击事件的执行过程实例分析【冒泡与捕获】


Posted in Javascript onApril 11, 2020

本文实例讲述了js点击事件的执行过程。分享给大家供大家参考,具体如下:

js事件对象event包括很多事件类型,这里用onclick事件为例,探讨一下在js事件捕获机制和冒泡机制下的执行过程,以及如何阻止事件的捕获和冒泡。

首先看下当我们点击一个元素后,浏览器的执行过程。

1,当某个元素绑定的事件被触发时,这时浏览器就会从顶级document元素发出一个事件流

2,这个事件流顺着dom层级,一层一层向下找,直到遇到了触发事件的目标元素,这个查找的过程是捕获阶段

  说明:捕获阶段,在查找每一层dom时,遇到相同的事件默认不执行,元素的事件默认在冒泡阶段执行

3,到达目标元素后会触发目标元素绑定的事件函数,也就是目标元素事件函数处理阶段

4,在处理过目标元素事件后,在顺着dom层级一层一层向上查找,这时对应dom上如果有相同的事件,默认会被触发,冒泡阶段

实例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  
 <div class="box" style="width:300px;height:300px;background:green;" οnclick="firstClick()">
  parent
  <div class="child" οnclick="secondClick()">child
    <div class="button" onclick = "thirdClick()">提交</div>
  </div>
</div>
<script>
  var divs=document.querySelectorAll("div");//获取所有的divs
  function firstClick(){
    alert('firstClick')
  }
  function secondClick(){
    alert('secondClick')
  }
  function thirdClick(){
    alert('thirdClick')
  }
  function fn0(){
    alert("box");
  }
  function fn1(){
    alert("child");
  }
  function fn2(){
    alert("but");
  }
  divs[0].addEventListener("click",fn0,false);
  divs[1].addEventListener("click",fn1,false);
  divs[2].addEventListener("click",fn2,false);
</script>
</body>
</html>

说明:

addEventListener有三个参数,最后一个参数是决定元素事件的触发阶段,默认是false,在冒泡阶段执行,设置为true,则在捕获阶段执行。

在dom上直接绑定的事件会在addEventListenter监听的事件执行之后执行。

阻止冒泡:

onclick = function(e){
  e=e||window.event;
    if(e.stopPropagation){
    e.stopPropagation();//其它浏览器
  }else{
    e.cancelBubble=true;//IE浏览器
  }
}

阻止捕获:判断e.target

function fn0(e){
  if(e.target == divs[0]){
    alert("fn0");
  }
}
divs[0].addEventListener("click",fn0,true);

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

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

Javascript 相关文章推荐
效率高的Javscript字符串替换函数的benchmark
Aug 02 Javascript
关于Javascript模块化和命名空间管理的问题说明
Dec 06 Javascript
js 利用className得到对象的实现代码
Nov 15 Javascript
jQuery使用数组编写图片无缝向左滚动
Dec 11 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
Mar 23 Javascript
JS验证IP,子网掩码,网关和MAC的方法
Jul 02 Javascript
javascript中tostring()和valueof()的用法及两者的区别
Nov 16 Javascript
jquery 校验中国身份证号码实例详解
Apr 11 jQuery
Vue调试神器vue-devtools安装方法
Dec 12 Javascript
iView框架问题整理小结
Oct 16 Javascript
JS实现深度优先搜索求解两点间最短路径
Jan 17 Javascript
深入剖析JavaScript instanceof 运算符
Jun 14 Javascript
JavaScript运行机制实例分析
Apr 11 #Javascript
js中调用微信的扫描二维码功能的实现代码
Apr 11 #Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
Apr 11 #Javascript
微信分享invalid signature签名错误踩过的坑
Apr 11 #Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
Apr 11 #Javascript
vue使用微信扫一扫功能的实现代码
Apr 11 #Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
Apr 11 #Javascript
You might like
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
PHP比你想象的好得多
2014/11/27 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
Js中sort()方法的用法
2006/11/04 Javascript
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
javascript事件模型介绍
2016/05/31 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
Python爬取成语接龙类网站
2018/10/19 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
Python发展简史 Python来历
2019/05/14 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
悬空寺导游词
2015/02/05 职场文书
2015员工年度考核评语
2015/03/25 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
nginx结合openssl实现https的方法
2021/07/25 Servers
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js