所以,e.target 和 e.currentTarget 到底有啥區別呢?

Sunshine_Lin發表於2022-03-02

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心

背景

大家開發中經常會跟DOM的事件打交道,也會經常用到 e.target e.currentTarget 這兩個物件,但是卻有很多人根本就不知道這兩個有什麼區別~~~

冒泡 & 捕獲

當你觸發一個元素的事件的時候,該事件從該元素的祖先元素傳遞下去,此過程為 捕獲 ,而到達此元素之後,又會向其祖先元素傳播上去,此過程為 冒泡

    <div id="a">
      <div id="b">
        <div id="c">
          <div id="d">哈哈哈哈哈</div>
        </div>
      </div>
    </div>

addEventListener

addEventListener 是為元素繫結事件的方法,他接收三個引數:

  • 第一個引數:繫結的事件名
  • 第二個引數:執行的函式
  • 第三個引數:

    • false:預設,代表冒泡時繫結
    • true:代表捕獲時繫結

target & currentTarget

false

我們給四個div元素繫結事件,且 addEventListener 第三個引數不設定,則預設設定為 false

const a = document.getElementById('a')
const b = document.getElementById('b')
const c = document.getElementById('c')
const d = document.getElementById('d')
a.addEventListener('click', (e) => {
  const {
    target,
    currentTarget
  } = e
  console.log(`target是${target.id}`)
  console.log(`currentTarget是${currentTarget.id}`)
})
b.addEventListener('click', (e) => {
  const {
    target,
    currentTarget
  } = e
  console.log(`target是${target.id}`)
  console.log(`currentTarget是${currentTarget.id}`)
})
c.addEventListener('click', (e) => {
  const {
    target,
    currentTarget
  } = e
  console.log(`target是${target.id}`)
  console.log(`currentTarget是${currentTarget.id}`)
})
d.addEventListener('click', (e) => {
  const {
    target,
    currentTarget
  } = e
  console.log(`target是${target.id}`)
  console.log(`currentTarget是${currentTarget.id}`)
})

現在我們點選,看看輸出的東西,可以看出觸發的是d,而執行的元素是冒泡的順序

target是d currentTarget是d
target是d currentTarget是c
target是d currentTarget是b
target是d currentTarget是a

true

我們把四個事件第三個引數都設定為 true ,我們看看輸出結果,可以看出觸發的是d,而執行的元素是捕獲的順序

target是d currentTarget是a
target是d currentTarget是b
target是d currentTarget是c
target是d currentTarget是d

區別

我們可以總結出:

  • e.target 觸發事件的元素
  • e.currentTarget 繫結事件的元素

結語

我是林三心,一個熱心的前端菜鳥程式設計師。如果你上進,喜歡前端,想學習前端,那我們們可以交朋友,一起摸魚哈哈,摸魚群,加我請備註【思否】

image.png

相關文章