在早期 jQuery 開發中,開發者常見兩種綁定點擊事件的寫法:
// 寫法一:簡便方法
$("div p").click(function(){ alert("sss"); });
// 寫法二:bind 方法
$("div p").bind("click", function(){ alert("sss"); });
雖然兩者在靜態元素上表現一致,但在動態元素處理、解綁操作、效能與維護性上存在本質差異。
$("div p").off("click") 移除所有點擊事件。$("div p").unbind("click") 即可精確移除該綁定,不影響其他事件類型。這是兩者最大的實戰差異:
<p> 元素,這些新元素不會自動繼承事件。// 現代推薦寫法:事件委托
$(document).on('click', 'div p', function(event){
alert("動態新增的 p 元素也能觸發!");
});
| 綁定方式 | 記憶體佔用 | 適用場景 |
|---|---|---|
| .click() / .bind() | 每個元素獨立綁定處理函數 | 少量靜態元素 |
| .on() 委托 | 單一處理函數掛載於祖先元素 | 大量元素、動態元素、長生命週期頁面 |
// ✅ 推薦:靜態元素直接綁定
$("#submitBtn").on("click", handleSubmit);
// ✅ 推薦:動態元素使用委托
$("#listContainer").on("click", ".item", handleItemClick);
// ❌ 不推薦:舊版 API
$("#submitBtn").bind("click", handleSubmit);
$("#listContainer").delegate(".item", "click", handleItemClick);
<ul id="todoList"></ul>
<button id="addItem">新增項目</button>
<script>
// 正確:委托給父容器
$("#todoList").on("click", "li", function(){
$(this).toggleClass("done");
});
// 錯誤:直接綁定 li (新增的 li 不會生效)
// $("#todoList li").click(function(){...});
$("#addItem").click(function(){
$("#todoList").append("<li>新任務 " + Date.now() + "</li>");
});
</script>
$(selector).on(event, handler)$(parent).on(event, childSelector, handler).off(event, selector, handler) 精確控制掌握事件委托機制,是處理現代前端動態互動介面的關鍵技能。