myForm 裡的哪一個具體物件觸發了 change 事件
你做得對!利用事件委派(Event Delegation)的方式,在父元素(<form>)上監聽 onchange 事件是一個高效的方法。
<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>
event 物件: 當事件發生時,瀏覽器會創建一個事件物件,並將其作為參數傳遞給事件處理函數(即使你沒有在函數簽名中顯式聲明 event,它通常也能在函數內部通過 event 關鍵字訪問,但顯式聲明是好習慣)。event.target: 這是事件的來源,也就是那個值被改變的 <input>, <select> 或 <textarea> 元素。檢查元素屬性: 你可以檢查 changedElement.id, changedElement.name, changedElement.type 等屬性來判斷是哪個具體的欄位觸發了事件,並執行相應的邏輯。獲取值: 注意對於 checkbox 和 radio 按鈕,你可能更關心的是它的 checked 狀態 (true/false) 或選中的 value,而不是 value 屬性本身。對於其他元素,value 屬性通常是你想要的。addEventListener: 雖然直接賦值給 onchange 可以工作,但使用 addEventListener('change', function(event) {...}) 是更現代、更靈活且推薦的做法。
留言
張貼留言