你根本不懂Javascript(5): HTML事件捕获与冒泡

本文最初发布于http://szhshp.org
转载请注明

事件捕捉与冒泡

先捕获的必然是父节点, 然后一层层向下捕获, 然后一层层向上冒泡

这里是一个td被点击的效果图

通过三个阶段:

  1. 捕捉阶段: 从父节点, 逐渐向目标节点冒泡, 即自上向下
  2. 接近目标elem阶段(这一阶段会同时激活第一阶段和第三阶段的handler)
  3. 冒泡阶段: 从子节点向父节点冒泡

事件绑定机制

  1. onXXX(event)
  2. addEventListener(event, handler)
  3. jQuery的elem.on(event, selector, handler)

这里有几点需要注意的:

event.target: 发起event的elem

this: 当前elem

  • 通过onXXX()或者addEventListener(event, handler)绑定的事件无法接触到捕捉阶段, 他们只会响应第二和第三阶段
  • 此外, 对于addEventListener(event, handler)的最后一个函数:
    • false: handler放置在冒泡阶段
    • true: handler放置在捕捉阶段
  • 仅仅对于elem.on(event, selector, handler), 只需要return false可以既阻止默认事件, 又防止冒泡

阻止冒泡

一般不需要阻止冒泡, 因为阻止冒泡之后,可能影响其他事件捕捉机制

组织冒泡的核心在于这个函数:event.stopPropagation()

阻止冒泡之后, 事件将不会继续传递

下面这一段就不会调用到bodyonclick

<body onclick="alert(`the bubbling doesn‘t reach here`)">
  <button onclick="event.stopPropagation()">Click me</button>

  <!-- 错误的例子,这个仅仅阻止了默认事件 -->
  <!-- <button onclick="return false;">Click me</button> -->
</body>

另外几种阻止冒泡的用法:

// 既阻止冒泡, 又阻止默认事件, 仅仅对于`elem.on(event, selector, handler)`有效
// $("#div1").on(‘click‘,function(){
//     return false;
// });

//以下两种情况阻止事件冒泡
//oEvent.cancelBubble = true;
//oEvent.stopPropagation();

//以下两种情况阻止默认行为, 没有停止冒泡
//没有停止冒泡
//oEvent.preventDefault();
//return false;

参考文献

https://javascript.info/bubbling-and-capturing

原文地址:https://www.cnblogs.com/szhshp/p/8536721.html

时间: 2024-10-09 00:37:03

你根本不懂Javascript(5): HTML事件捕获与冒泡的相关文章

JavaScript 详说事件机制之冒泡、捕获、传播、委托

DOM事件流(event  flow )存在三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段. 事件捕获(dubbed  bubbling):通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会从根节点开始由外到内进行事件传播,即点击了子元素,如果父元素通过事件捕获方式注册了对应的事件的话,会先触发父元素绑定的事件. 事件冒泡(event  capturing):与事件捕获恰恰相反,事件冒泡顺序是由内到外进行事件传播,直到根节点. 无论是事件捕获还是事件冒泡,它们都有一个共同的行为,就是事

javascript事件捕获与冒泡

对“捕获”和“冒泡”这两个概念,我想我们对冒泡更熟悉一些,因为在我们使用的所有浏览器中,都支持事件冒泡,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样.而在像firefox,chrome,safari这类所谓的标准浏览器中,事件传播还有个阶段,那就是捕获阶段,这个很少 有用武之地,所以被人疏忽遗忘也在所难免了,不常用不代表它不存在,本着科学严谨的态度,我们有必要去看一下它的庐山真面目. 事实上,捕获阶段是一个和冒泡阶段完全相反的过程,即事件由祖先元素向子元素传播,和一个石子儿从水

事件捕获和冒泡

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Monaco; color: #2b7ec3 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Monaco; color: #d74200 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Monaco; color: #4f5d66 } p.p4 { margin: 0

事件捕获与冒泡的再探

先看一段代码,猜猜输出结果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="id1" style="width: 200px;height:200px;border

事件捕获、冒泡、绑定、赋值、委托、兼容、滚轮

clientX/Y           可视区的鼠标坐标                  全兼容 offsetX/Y           鼠标坐标到物体边框的距离    IE+Chrome pageX/Y             页面                                    高级 浏览器 screenX/Y           屏幕                                    全兼容(没用) var e =  evt || window.

Js事件捕获和冒泡

昨天有个面试官问我的问题,他直接问我两个DIV嵌套,都有click事件,单击的时候先弹出子DIV还是父DIV.完全不知所以然. 过后经过查询资料后,很是惭愧.原来他问的就是关于JS捕获和冒泡的. 我查询了一些资料: 事件捕获(父--> 子) 当你使用事件捕获时,父级元素先触发,子级元素后触发,即div先触发,p后触发. 事件冒泡(子--> 父) 当你使用事件冒泡时,子级元素先触发,父级元素后触发,即p先触发,div后触发. W3C模型 W3C模型是将两者进行中和,在W3C模型中,任何事件发生时

js中addEventListener第三个参数涉及到的事件捕获与冒泡

js中,我们可以给一个dom对象添加监听事件,函数就是 addEventListener("click",function(){},true); 很容易理解,第一个参数是事件类型,比如点击(click).触摸(touchstart), 第二个参数就是事件函数, 比如我给一个button添加alert函数. window.onload=function(){ document.getElementById("hello").addEventListener("

JS中的事件顺序(事件捕获与冒泡)

问题 如果一个元素和它的祖先元素注册了同一类型的事件函数(例如点击等), 那么当事件发生时事件函数调用的顺序是什么呢? 比如, 考虑如下嵌套的元素: ----------------------------------- | outer | | ------------------------- | | |inner | | | ------------------------- | | | ----------------------------------- 两个元素都有onclick的处理

js事件捕获和冒泡解析

<div id="box"> <div id="box2"> <p id="test">test</p> </div> </div> <script> document.getElementById('box').addEventListener('click',function () { console.log('box') },true) document.g