myForm 裡的哪一個具體物件觸發了 change 事件

 你做得對!利用事件委派(Event Delegation)的方式,在父元素(<form>)上監聽 onchange 事件是一個高效的方法。

要知道是 myForm 裡的哪一個具體物件(例如 <input>, <select>, <textarea>)觸發了 change 事件,你可以使用事件物件 (event) 的 target 屬性。

change 事件從觸發它的子元素冒泡(bubble up)到表單時,事件處理函數會接收到一個 event 物件。這個物件的 event.target 屬性會指向實際觸發事件的那個子元素

以下是如何實現:

      <form id="myForm" name="myForm">
  <label for="username">Username:</label>
  <input type="text" id="username" name="username"><br><br>

  <label for="country">Country:</label>
  <select id="country" name="country">
    <option value="">--Select--</option>
    <option value="us">United States</option>
    <option value="ca">Canada</option>
    <option value="mx">Mexico</option>
  </select><br><br>

  <label>Options:</label><br>
  <input type="checkbox" id="option1" name="options" value="1">
  <label for="option1">Option 1</label><br>
  <input type="checkbox" id="option2" name="options" value="2">
  <label for="option2">Option 2</label><br><br>

  <textarea name="comments" placeholder="Comments"></textarea><br><br>
</form>

<script>
  const myForm = document.forms["myForm"]; // 或者 document.getElementById('myForm');

  myForm.onchange = function(event) {
    // event.target 就是觸發 change 事件的那個元素
    const changedElement = event.target;

    console.log("--- Change Detected ---");
    console.log("Element TagName:", changedElement.tagName); // 例如: INPUT, SELECT, TEXTAREA
    console.log("Element ID:", changedElement.id);
    console.log("Element Name:", changedElement.name);
    console.log("Element Type:", changedElement.type); // 例如: text, select-one, checkbox, textarea

    // 根據元素類型獲取新值
    let newValue;
    if (changedElement.type === 'checkbox') {
      newValue = changedElement.checked; // checkbox 的值是 true/false
      console.log("New Checked State:", newValue);
    } else {
      newValue = changedElement.value; // 其他類型 (text, select, textarea) 的值
      console.log("New Value:", newValue);
    }

    console.log("----------------------");

    // 你可以在這裡根據 changedElement 的 id 或 name 添加具體的邏輯
    if (changedElement.id === 'country') {
      console.log(`Country selection changed to: ${newValue}`);
      // 執行與國家選擇相關的操作...
    } else if (changedElement.name === 'username') {
       console.log(`Username changed to: ${newValue}`);
       // 執行與用戶名相關的操作...
    }
  };

  // --- 使用 addEventListener (更推薦的方式) ---
  /*
  myForm.addEventListener('change', function(event) {
    const changedElement = event.target;
    console.log("Changed Element (using addEventListener):", changedElement.id || changedElement.name);
    // ... 其他邏輯同上 ...
  });
  */
</script>
    

關鍵點:

  1. event 物件: 當事件發生時,瀏覽器會創建一個事件物件,並將其作為參數傳遞給事件處理函數(即使你沒有在函數簽名中顯式聲明 event,它通常也能在函數內部通過 event 關鍵字訪問,但顯式聲明是好習慣)。

  2. event.target 這是事件的來源,也就是那個值被改變的 <input>, <select><textarea> 元素。

  3. 檢查元素屬性: 你可以檢查 changedElement.id, changedElement.name, changedElement.type 等屬性來判斷是哪個具體的欄位觸發了事件,並執行相應的邏輯。

  4. 獲取值: 注意對於 checkboxradio 按鈕,你可能更關心的是它的 checked 狀態 (true/false) 或選中的 value,而不是 value 屬性本身。對於其他元素,value 屬性通常是你想要的。

  5. addEventListener 雖然直接賦值給 onchange 可以工作,但使用 addEventListener('change', function(event) {...}) 是更現代、更靈活且推薦的做法。

通過使用 event.target,你就可以在表單級別的事件監聽器中,精確地知道是哪個子元素觸發了 change 事件。

留言

這個網誌中的熱門文章

Offscreen Canvas

外部網頁新增 Google 日曆行程(URL模板)

計算 Canvas 文字最大字體