冒泡和捕获

冒泡(bubbling)

当一个事件发生在一个元素上,他会首先运行在该元素上的处理程序,然后运行其父元素上的处理程序,然后一直向上到其他祖先的处理程序。

<form onclick="alert('form')">FORM
  <div onclick="alert('div')">DIV
    <p onclick="alert('p')">P</p>
  </div>
</form>

点击内部的 <p> 会首先运行 onClick:

  1. 在该 <p>上的
  2. 然后是外部的 <div>上的
  3. 然后外部 <form>上的
  4. 以此类推,直到最后的 document对象

!注意 !

几乎 所有的事件都会冒泡

几乎!!

例如,focus事件不会冒泡。

event.target

引发事件的那个嵌套层级最深的元素被称为目标元素,通过 event.target访问

注意与 this(=event.currentTarget)之前的区别:

  • event.target——触发事件的目标元素,它在冒泡过程中不会发生变化。就是事件写在哪个位置这个就指向哪
  • this——是“当前”元素,其中有一个当前正在运行的处理程序。

例子直接看https://zh.javascript.info/bubbling-and-capturing#eventtarget,非常生动,一看就懂了

停止冒泡

event.stopPropagation(): 停止向上移动,但是当前元素的其他处理程序都会继续运行

event.stopImmediatePropagation():可以用于阻止冒泡,并阻止当前元素上的处理程序运行。

通常,没有真正的必要去阻止冒泡

捕获

很少用于实际开发中,但有时是有用的。

DOM事件标准描述了事件传播的3个阶段:

  • 捕获阶段(Capturing phase)——事件(从Window)向下走向元素
  • 目标阶段(Target phase)——事件到达目标元素
  • 冒泡阶段(Bubbling phase)——事件从元素上开始冒泡

WindowDocument<html><body><table><tbody><tr><tr><td>Shady Grove<td>Aeolian<td>Over the River,Charlie<td>DorianTargetPhase(2)CapturePhase(1)BubblingPhase(3)

addEventListener第三个参数设置为 false(默认值),则在冒泡阶段执行处理程序

!要移除处理程序removeEventListener需要同一阶段

!同一元素的同一阶段的监听器按其设置顺序运行

原文:https://zh.javascript.info/bubbling-and-capturing

### 如何在JSX中阻止事件冒泡捕获 在React应用开发过程中,有时需要控制DOM事件的行为,比如阻止事件冒泡或改变其传播路径。这可以通过调用特定的事件对象方法来完成。 对于阻止事件冒泡而言,可以利用`event.stopPropagation()`方法。此方法会停止当前正在处理的事件向祖先节点传递[^1]: ```jsx function ChildComponent(props) { function handleClick(event) { event.stopPropagation(); console.log('Child component clicked'); } return ( <div onClick={handleClick}> Click me, but I will not let my parent know. </div> ); } ``` 如果目标是在捕获阶段就拦截并终止事件,则应该使用`event.stopImmediatePropagation()`。该方法不仅能够阻止同一事件类型的其他监听器被触发,还能中断事件在整个DOM树上的进一步传播: ```jsx function ParentComponent() { function handleParentClick(event) { console.log('Parent was notified.'); } return ( <div onClick={handleParentClick}> <ChildComponent /> </div> ); } // In ChildComponent.js function ChildComponent(props) { function handleClick(event) { event.stopImmediatePropagation(); // This prevents both bubbling up and other handlers at this level from being called console.log('Only child knows about this click.'); } return ( <button onClick={handleClick}>Try clicking here</button> ); } ``` 另外,在定义事件处理器时还可以指定第三个参数为`true`,以此表明希望在捕获阶段而不是默认的冒泡阶段执行回调函数。不过需要注意的是,这种方式并不适用于所有的浏览器版本,因此建议优先考虑前两种方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值