場景:DataTables 動態渲染的 checkbox,AJAX 回調中嘗試根據返回數據勾選對應項,$("input:checkbox[value='...']") 選中器返回 `undefined`,靜態寫死的 checkbox 卻正常。
代碼執行順序:
$("input:checkbox[value='"+id+"']").prop('checked', true)prop() 而非 attr()// 錯誤
$("input:checkbox[value='"+id+"']").attr('checked', 'true');
// 正確
$("input:checkbox[value='"+id+"']").prop('checked', true);
原因:checked、selected、disabled 是 **DOM 屬性**,反映當前狀態,prop() 操作屬性;attr() 操作 HTML 屬性(初始值),不會改變渲染狀態。
// 方案 A:DataTables 繪製完成事件
table.on('draw.dt', function() {
selectCheckboxesByIds(responseIds);
});
// 方案 B:fnDrawCallback 初始化時指定
$('#table').DataTable({
fnDrawCallback: function() { selectCheckboxesByIds(ids); }
});
// 方案 C:簡單粗暴 setTimeout (不推薦生產)
setTimeout(function() { selectCheckboxesByIds(ids); }, 0);
function selectCheckboxesByIds(ids) {
if (!Array.isArray(ids) || ids.length === 0) return;
// 使用 prop 批量設置
ids.forEach(function(id) {
var $chk = $("input:checkbox[value='" + id + "']");
if ($chk.length) {
$chk.prop('checked', true);
} else {
console.warn('Checkbox not found for id:', id);
}
});
}
// AJAX 成功回調中
success: function(data) {
var ids = data.actConfg.map(function(item) { return item.businessId; });
// 確保在 DOM 更新後執行
setTimeout(function() { selectCheckboxesByIds(ids); }, 0);
}
$("input:checkbox[value='目標值']").length 驗證選中器能否匹配value 屬性值型別一致(字串 vs 數字)核心口訣:**動態元素等 DOM 就緒,狀態屬性用 prop,初始屬性用 attr**。