javascript事件冒泡,事件捕获和事件委托详解

作者:Patty_2000 时间:2024-04-10 14:02:47 

1、事件冒泡:在javascript事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止。并不是所有的事件都有冒泡现象,比如如下几个:blur事件 ,focus事件, load事件

2、事件委托:事件捕获恰好与事件冒泡相反,它从顶层祖先元素开始,直到事件触发元素。

js事件捕获一般通过DOM2事件模型addEventListener来实现的:

target.addEventListener(type, listener, useCapture)

第三个参数默认设置为false,表示在冒泡阶段出发事件,设置为true时表示在捕获阶段触发,一般我们工作中似乎很少使用事件捕获。但还是要理解一下


<div id="box">
   <div id="middle">
       <div id="inner"></div>
   </div>
</div>
<script>
//事件捕获
window.onload=function(){
   let box=document.getElementById("box");
   let middle=document.getElementById("middle");
   let inner=document.getElementById("inner");
   box.addEventListener("click",function(){console.log("box")},true);
   middle.addEventListener("click",function(){console.log("middle")},true);
   inner.addEventListener("click",function(){console.log("inner")},true);
}
</script>
点击inner,控制台依次输出:box,middle,inner

阻止事件冒泡

平时会用到大量的事件冒泡事件,但是可能我们在某个子级标签不需要传递事件给父级,这时候就需要阻止它事件的冒泡。

一般,使用stopPropagation来阻止事件的冒泡,IE中使用cancleBuble=true,stopPropagation也是事件对象(Event)的一个方法,作用是阻止目标元素的冒泡事件,但是会不阻止默认行为。


//阻止事件冒泡
let btna = document.getElementById('btn');
btna.onclick=function(e){
   window.event? window.event.cancelBubble = true : e.stopPropagation();
};

3、事件委托:事件委托又可以叫事件代理,事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。

益处:减少dom操作可以提高网页性能,当一个页面的父级元素和很多子级元素都需要操作同一件事件的时候,我们不可能每个元素都去给它绑定一个事件


<ul id="getNum">
   <li>1</li>
   <li>2</li>
   <li>3</li>
   <li>4</li>
   <li>5</li>
   <li>6</li>
</ul>
<script>
let ptclick = document.getElementById('getNum');
let lilist = ptclick.querySelectorAll('li');
for(let i=0;i<lilist.length;i++){
   lilist[i].index = i;
};
ptclick.onclick = function(e){
   var e = e || window.event;
   var target = e.target || e.srcElement;
   console.log(e.target.index);
};
</script>

来源:https://blog.csdn.net/Patty_2000/article/details/121238245

标签:javascript,事件冒泡,事件捕获,事件委托
0
投稿

猜你喜欢

  • 快速解决pandas.read_csv()乱码的问题

    2023-07-10 21:14:47
  • 解决MAC系统升级后虚拟机黑屏问题

    2022-08-10 05:37:53
  • Mysql中mvcc各场景理解应用

    2024-01-24 19:29:07
  • Python利用Gradio与EasyOCR构建在线识别文本的Web应用

    2023-05-31 09:35:57
  • PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数

    2023-06-09 01:05:00
  • 如何让Firefox2和Firefox3在Windows下共存并同时运行?

    2008-06-01 15:50:00
  • 浅议Wap网页设计中的锚点链接

    2010-12-17 12:41:00
  • tensorflow如何批量读取图片

    2023-10-25 03:50:25
  • Tornado Web服务器多进程启动的2个方法

    2022-01-21 04:41:05
  • 教你如何用Python实现人脸识别(含源代码)

    2021-03-14 23:33:03
  • Python 合并拼接字符串的方法

    2022-05-26 08:58:08
  • 解析MySQL join查询的原理

    2024-01-17 13:28:46
  • js正则的几个基本概念

    2007-09-30 20:02:00
  • Windows Server2008 R2 MVC 环境安装配置教程

    2024-01-17 06:45:24
  • 懒人必备Python代码之自动发送邮件

    2022-08-31 20:17:41
  • 一文教你用Pyecharts做交互图表

    2022-11-20 22:33:38
  • 基于python的Paxos算法实现

    2023-04-15 07:40:58
  • Python的Flask框架中集成CKeditor富文本编辑器的教程

    2022-08-25 11:26:22
  • win10环境下使用Hyper-V进行虚拟机创建的教程(图解)

    2022-08-01 02:25:06
  • ASP中使用Form和QueryString集合

    2007-09-14 10:43:00
  • asp之家 网络编程 m.aspxhome.com