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 相关文章推荐
鼠标经过的文本框textbox变色
May 21 Javascript
document.compatMode介绍
May 21 Javascript
Javascript 类型转换方法
Oct 24 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
Dec 21 Javascript
javascript里绝对用的上的字符分割函数总结
Jul 31 Javascript
JQuery的ON()方法支持的所有事件罗列
Feb 28 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
May 25 Javascript
JavaScript中利用构造器函数模拟类的方法
Feb 16 Javascript
微信web端后退强制刷新功能的实现代码
Mar 04 Javascript
详解js根据百度地图提供经纬度计算两点距离
May 13 Javascript
vue项目中mock.js的使用及基本用法
May 22 Javascript
微信小程序缓存支持二次开发封装实现解析
Dec 16 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
Phpbean路由转发的php代码
2008/01/10 PHP
php设计模式 Interpreter(解释器模式)
2011/06/26 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
js实现全选和全不选功能
2020/07/28 Javascript
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
Python进阶篇之字典操作总结
2016/11/16 Python
Python 基础知识之字符串处理
2017/01/06 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
Python threading的使用方法解析
2019/08/28 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
经理秘书岗位职责
2013/11/14 职场文书
大学生自我鉴定范文模板
2014/01/21 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
Redis 常见使用场景
2021/08/30 Redis