事件冒泡和事件捕获

124 阅读2分钟

事件冒泡和事件捕获

我们会发现默认情况下事件是从最内层的span向外依次传递的顺序,这个顺序我们称之为事件冒泡(Event Bubble)。

事实上,还有另外一种监听事件流的方式就是从外层到内层(body -> span),这种称之为事件捕获(Event Capture);

为什么会产生两种不同的处理流呢?

这是因为早期浏览器开发时,不管是IE还是Netscape公司都发现了这个问题,但是他们采用了完全相反的事

件流来对事件进行了传递;

IE采用了事件冒泡的方式,Netscape采用了事件捕获的方式;

那么我们如何去监听事件捕获的过程呢?

const spanEl = document.querySelector(".span")
const divEl = document.querySelector(".container")

spanEl.addEventListener("click", () => {
  console.log("事件冒泡:span元素被点击了")
})

divEl.addEventListener("click", () => {
  console.log("事件冒泡:div元素被点击了")
})

document.body.addEventListener("click", () => {
  console.log("事件冒泡:body元素被点击了")
})

// 再次监听
spanEl.addEventListener("click", (event) => {
  console.log("事件捕获:span元素被点击了")
  event.stopPropagation()
}, true)

divEl.addEventListener("click", () => {
  console.log("事件捕获:div元素被点击了")
}, true)

document.body.addEventListener("click", (event) => {
  console.log("事件捕获:body元素被点击了")
}, true)


事件对象event

当一个事件发生时,就会有和这个事件相关的很多信息:

比如事件的类型是什么,你点击的是哪一个元素,点击的位置是哪里等等相关的信息;

那么这些信息会被封装到一个Event对象中;

该对象给我们提供了想要的一些属性,以及可以通过该对象进行某些操作;

常见的属性:

type:事件的类型;

target:当前事件发生的元素;

currentTarget:当前处理事件的元素;

offsetX、offsetY:点击元素的位置;

常见的方法:

preventDefault:取消事件的默认行为;

stopPropagation:阻止事件的进一步传递;

事件类型:developer.mozilla.org/zh-CN/docs/…

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情