Skip to content

您了解事件物件(Event Object)嗎?

當任何的事件發生時,瀏覽器就會為這個事件創造一個物件,我們稱為事件物件(Event object)。它會提供的額外資訊,依照事件類型的不同,會帶有不同的資料。在下方程式碼中,事件物件會以參數的形式傳給我們。

html
<div>
  <input id="Btn" type="button" value="我是按鈕" />
</div>
js
document.querySelector("#Btn").addEventListener("click", (e) => {
  // e: 本身包含了所有事件共同的屬性及方法
  console.log(e);
});

type

回傳一個代表此事件物件類型的字串。

html
<div>
  <input id="Btn" type="button" value="我是按鈕" />
</div>
js
document.querySelector("#Btn").addEventListener("click", (e) => {
  // type: click
  console.log("type: ", e.type);
});

target 與 currentTarget

以下將觸發的對象改為 <div>

html
<div id="Box">
  <input type="button" value="我是按鈕" />
</div>
js
document.querySelector("#Box").addEventListener("click", (e) => {
  // 指向觸發的 DOM 物件,也就是 <input>
  console.log("target: ", e.target);

  // 指向監聽的 DOM 物件,也就是 <div>
  console.log("currentTarget: ", e.currentTarget);
});

nodeName 與 tagName

如果只是處理元素,那麼使用 tagNamenodeName 沒有差別。

html
<div>
  <input id="Btn" type="button" value="我是按鈕" />
</div>
js
document.querySelector("#Btn").addEventListener("click", (e) => {
  // tagName: INPUT
  console.log("tagName:", e.target.tagName);

  // nodeName: INPUT
  console.log("nodeName:", e.target.nodeName);
});

與上述的結果一樣沒有差別。

js
// tagName: INPUT
console.log("tagName:", document.querySelector("#Btn").tagName);

// nodeName: INPUT
console.log("nodeName:", document.querySelector("#Btn").nodeName);

若對象不是元素,就有差異性了。

js
// tagName: undefined
console.log("tagName:", document.tagName);

// nodeName: #document
console.log("nodeName:", document.nodeName);

總結

tabName 只能用在元素節點上,而 nodeName 可以用在任何節點上,可以說 nodeName 涵蓋了 tagName,並且更具有更多的功能,因此,建議使用 nodeName