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