首页 > 其他分享 >【转】JS事件捕获和事件冒泡

【转】JS事件捕获和事件冒泡

时间:2023-10-10 14:55:23浏览次数:32  
标签:parent 捕获 JS 事件 addEventListener click 冒泡

DOM事件流(event flow )存在三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。

事件捕获(event capturing): 当鼠标点击或者触发dom事件时(被触发dom事件的这个元素被叫作事件源),浏览器会从根节点 =>事件源(由外到内)进行事件传播。

事件冒泡(dubbed bubbling): 事件源 =>根节点(由内到外)进行事件传播。

无论是事件捕获还是事件冒泡,它们都有一个共同的行为,就是事件传播。

dom标准事件流的触发的先后顺序为:先捕获再冒泡。即当触发dom事件时,会先进行事件捕获,捕获到事件源之后通过事件传播进行事件冒泡。

addEventListener的第三个参数
在我们平常用的addEventListener方法中,一般只会用到两个参数,一个是需要绑定的事件,另一个是触发事件后要执行的函数,然而,addEventListener还可以传入第三个参数:

element.addEventListener(event, function, useCapture);

第三个参数默认值是false,表示在事件冒泡阶段调用事件处理函数;如果参数为true,则表示在事件捕获阶段调用处理函数。
事件冒泡

<body>
  <div id="parent">
    父元素
    <div id="child">
      子元素
    </div>
  </div>
  <script type="text/javascript">
    var parent = document.getElementById("parent");
    var child = document.getElementById("child");
document.body.addEventListener("click",function(e){
  console.log("click-body");
},false);

parent.addEventListener("click",function(e){
  console.log("click-parent");
},false);

child.addEventListener("click",function(e){
  console.log("click-child");
},false);

</script>
</body>

点击子元素时结果如下:

事件触发顺序是由内到外的,这就是事件冒泡。如果点击子元素不想触发父元素的事件,可使用event.stopPropagation();方法:

child.addEventListener("click",function(e){
  console.log("click-child");
   e.stopPropagation();
},false);

事件捕获
修改事件冒泡的代码:

var parent = document.getElementById("parent");
var child = document.getElementById("child");

document.body.addEventListener("click",function(e){
console.log("click-body");
},false);

parent.addEventListener("click",function(e){
console.log("click-parent---事件传播");
},false);
    
     //新增事件捕获事件代码
parent.addEventListener("click",function(e){
console.log("click-parent--事件捕获");
},true);

child.addEventListener("click",function(e){
console.log("click-child");
},false);

点击子元素时结果如下:


父元素通过事件捕获的方式注册了click事件,所以在事件捕获阶段就会触发,然后到了目标阶段,即事件源,之后进行事件冒泡,parent同时也用冒泡方式注册了click事件,所以这里会触发冒泡事件,最后到根节点(body)。这就是整个事件流程。

转自: JS之事件捕获和事件冒泡

标签:parent,捕获,JS,事件,addEventListener,click,冒泡
From: https://www.cnblogs.com/tobieance/p/17754671.html

相关文章

  • js-cookie库
    https://blog.csdn.net/weixin_49046027/article/details/121123014https://www.cnblogs.com/gopark/p/13743364.html简介js-cookie是一个简单的,轻量级的处理cookies的jsAPI,主要用来处理cookie相关的插件使用1.下载npmi-Djs-cookie2.引入importCookiesfrom'j......
  • MongoDB Node.js Driver and MongoClient All In One
    MongoDBNode.jsDriverandMongoClientAllInOneThenextgenerationNode.jsdriverforMongoDB$npmimongodb#OR$npmi-Smongodb#OR$npminstallmongodb--savehttps://mongodb.github.io/node-mongodb-native/index.htmlhttps://www.mongodb.com......
  • phpStrom配置sass编译和JS压缩混淆
    1JS压缩混淆(YUICompressor)1.1安装java文件(jre-8u201-windows-x64.exe)1.2YUICompressor下载https://github.com/yui/yuicompressor/releases1.3Phpstrom配置:设置-工具-filewatcher配置YUICompressor参数Program参数:D:\MyLocalSoftWare\compressTool\java\bin\jav......
  • 前端、Vue.js和SVG的一些知识
    前端、Vue.js和SVG的一些知识一、前端简介  1、什么是HTML(静态)(超文本标记语言HyperTextMarkupLanguage),HTML是用来描述网页的一种语言。  2、CSS(层叠样式表CascadingStyleSheets),样式定义如何显示HTML元素,语法为:selector{property:value}(选择符{属性:值}) ......
  • js1之基础知识
    1简介1.1计算机语言计算机语言指用于人与计算机之间通讯的语言,它是人与计算机之间传递信息的媒介。总的来说,可以分成机器语言,汇编语言和高级语言三大类。实际上计算机最终所执行的都是机器语言,它是由“0”和“1”组成的二进制数,二进制是计算机语言的基础。0=000000001=00......
  • Spring Boot 访问静态资源css/js
    一、前言我们用SpringBoot搭建Web应用时(如搭建一个博客),经常需要在Html中访问一些静态资源,比如:css样式;js脚本;favicon.ico图标等;而在SpringBoot中如果没有做任何配置,是无法直接访问静态资源的,通常会报404错误二、SpringBoot访问静态资源的默认目录Spring......
  • [899] Save a dictionary as a file (JSON)
    InPython,youcansaveadictionaryasafileusingvariousmethods,suchasJSON,Pickle,orCSV.Here,I'llshowyouhowtosaveadictionaryasaJSONfileandthenreadthatJSONfilebackintoadictionary.SavingaDictionaryasaJSONFile:Y......
  • js_使用js读取link外部样式
    <linkrel="stylesheet"href="https://at.alicdn.com/t/c/font_1826665_p96ije5uc2f.css"crossorigin>varlinkStyle=document.getElementsByTagName("link")[0];varsheet=linkStyle.sheet||linkStyle.styleSheet;letreg=......
  • JS实现红包分配(每个人至少1分钱)
    要实现红包分配,保证每个人至少分到1分钱,可以使用以下算法:将红包总金额以及要分配的人数作为输入参数。首先,生成一个(人数-1)范围内的随机数,表示第一个人分到的金额。确保至少会有一个人分到1分钱。然后,将剩余金额(总金额减去第一个人分到的金额)作为新的红包总金额。依次......
  • 启动vue项目报错——ERROR Error loading vue.config.js: ERROR TypeError: defineCon
    问题描述在我引入echarts模块之前是ok的,引入之后就启动失败了;问题解决一般情况下,都是该项目的版本与本机cmd里面的版本不对应导致的;只需要使用这个命令npmupgrade,更新版本,一直yes下去,就能够解决这个问题啦!......