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 相关文章推荐
Three.js源码阅读笔记(光照部分)
Dec 27 Javascript
JSON格式的键盘编码对照表
Jan 29 Javascript
js简单工厂模式用法实例
Jun 30 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
Oct 20 Javascript
Bootstrap每天必学之表单
Nov 23 Javascript
jQuery实现根据生日计算年龄 星座 生肖
Nov 23 Javascript
requirejs按需加载angularjs文件实例
Jun 08 Javascript
jquery使用FormData实现异步上传文件
Oct 25 jQuery
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
Jul 10 Javascript
vue 更改连接后台的api示例
Nov 11 Javascript
JS实现普通轮播图特效
Jan 01 Javascript
VueX模块的具体使用(小白教程)
Jun 05 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
深入PHP内存相关的功能特性详解
2013/06/08 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
JavaScript 中的事件教程
2007/04/05 Javascript
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
Jquery插件之多图片异步上传
2010/10/20 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
python中实现php的var_dump函数功能
2015/01/21 Python
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
Python实现JSON反序列化类对象的示例
2018/01/31 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
python爬虫超时的处理的实例
2018/12/19 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
Python实现自动访问网页的例子
2020/02/21 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
颁奖典礼主持词
2014/03/25 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers