input.onClick = "mod()"; // 無效:賦值字符串而非函數
// 或
input.setAttribute("onclick", "mod()"); // 可行但不推薦
點擊無反應,控制台無報錯。
const inputs = document.getElementsByTagName("input");
for (let input of inputs) {
input.style.border = "0px";
input.readOnly = true;
// 正確:傳遞函數引用
input.addEventListener("click", mod);
// 或帶參數箭頭函數
// input.addEventListener("click", () => mod(input.value));
}
function mod() {
console.log(111);
// this 指向被點擊的 input 元素
}
input.onclick = mod; // 直接賦值函數名 (引用)
// 或匿名函數
input.onclick = function() { mod(); };
// 僅在極少數動態生成 HTML 字符串場景使用
input.setAttribute("onclick", "mod()"); // 字符串會被解析為函數體
// 等價於 input.onclick = function onclick(event) { mod(); };
表格輸入框點擊事件
id name age
001 10
002 9
003 9
| 方式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| `addEventListener` | 多監聽、可移除、捕獲/冒泡控制、現代標準 | IE8- 不支持 (需 polyfill) | **首選** 所有新項目 |
| `element.onclick = fn` | 簡單、兼容性極好 | 同一事件僅支持一個處理器、覆蓋風險 | 簡單頁面、兼容舊瀏覽器 |
| `setAttribute("onclick", "str")` | 字符串模板生成 | CSP 限制、難調試、作用域混亂、性能差 | 極少數動態 HTML 生成場景 |
| HTML 內聯 `onclick="..."` | 直觀 | 結構行為耦合、CSP 違規、難維護 | **禁止** 生產環境 |
**`onclick = "字符串"` 無效**。**動態綁定必須賦值函數引用**:`element.onclick = handler` 或 `element.addEventListener('click', handler)`。現代開發**首選 `addEventListener`**,支持多監聽、可移除、作用域清晰、符合 CSP 安全策略。