UpdatePanel 部分更新時,**僅替換內容區域的 HTML**,原本透過 $(document).ready() 綁定的事件處理器**不會自動重新綁定**到新產生的 DOM 元素上,導致事件失效。
<script type="text/javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function () {
// 每次非同步回傳結束後重新綁定
$(document).ready(function () {
// --- 你的原始綁定邏輯 ---
var $span = $("input[id*='txtSpan']");
$span.off('focusout').on('focusout', function () {
var isZero = $(this).val() == "0";
$("#spRule").toggle(isZero);
$("input[id*='btnSave']").prop("disabled", isZero);
});
// --- 結束 ---
});
});
</script>
prm.add_endRequest:每次 UpdatePanel 更新完成觸發。.off().on() 避免重複綁定導致事件觸發多次。id*='txtSpan' 針對 ClientID 模式(如 ctl00_Content_txtSpan)依然有效。prm.add_endRequest(function (sender, args) {
var panels = args.get_panelsUpdated(); // 取得更新的 UpdatePanel 陣列
panels.forEach(function (panel) {
var $panel = $("#" + panel.id);
// 僅在更新區域內尋找並綁定
$panel.find("input[id*='txtSpan']").off('focusout').on('focusout', handler);
});
});
// 全域委派,無需重新綁定
$(document).on('focusout', "input[id*='txtSpan']", function () {
var isZero = $(this).val() == "0";
$("#spRule").toggle(isZero);
$("input[id*='btnSave']").prop("disabled", isZero);
});
**優點**:一次綁定、永久有效、支援動態新增元素。
**缺點**:事件冒泡至 document,極高頻事件可能有微小效能影響;若頁面結構複雜需注意選擇器精確度。
$(document).on(...)),最簡潔且無副作用。endRequest + panelsUpdated 精準重新綁定。endRequest 中再次包裹 $(document).ready(),直接執行綁定邏輯即可。