.live() 是 jQuery 1.3 引入、1.7 棄用、1.9 移除的事件委託方法。雖然歷史代碼中仍可見,但現代開發應使用 .on()。本文解析其原理、用法及遷移路徑。
// 綁定:為所有當前及未來 .clickme 元素綁定 click
$('.clickme').live('click', function() {
alert("Live handler called.");
});
// 動態添加元素
$('body').append('<button class="clickme">Another target</button>');
// 新元素無需重新綁定,自動生效
document(或指定 context)根節點上。event.target 是否匹配選擇器 .clickme。this 指向匹配元素。.find()、.children())。event.stopPropagation() 會阻斷冒泡,導致 live 失效。// 推薦:綁定在最近的靜態父容器上
$('#staticContainer').on('click', '.clickme', function() {
alert("Delegated handler called.");
});
// 等價於舊版 delegate()
$(document).delegate('.clickme', 'click', function() { ... }); // 1.7+ 內部轉向 .on()
// 直接綁定(僅針對現有元素,動態新增無效)
$('.clickme').on('click', function() { ... });
| 舊代碼 | 新代碼 |
|---|---|
$(sel).live(event, fn) | $(document).on(event, sel, fn) |
$(sel).die(event, fn) | $(document).off(event, sel, fn) |
$(sel).delegate(sub, event, fn) | $(sel).on(event, sub, fn) |
$(sel).undelegate(sub, event, fn) | $(sel).off(event, sub, fn) |
document,減少冒泡路徑。#list),用 $('#list').on('click', '.item', fn)。event delegation 替代循環綁定,節省內存、自動覆蓋動態元素。理解演進脈絡,編寫面向未來的高性能事件綁定代碼。