透過 $.post 取得資料後動態拼接 HTML 字串 append 到 tbody,新增的「修改/刪除」按鈕綁定 click 無反應。
$("#Delete").click(...) 在 DOM 就緒時執行,只綁定當時存在的元素。動態新增的元素不在綁定範圍內。
$('#tbody').on('click', '#Delete', function() {
var rowData = $(this).closest('tr').find('td:last').data('data');
alert('刪除: ' + rowData.record_title);
// location.href = "Delete.html?id=" + rowData.id;
});
$('#tbody').on('click', '#Change', function() {
var rowData = $(this).closest('tr').find('td:last').data('data');
alert('修改: ' + rowData.record_title);
});
success: function(result) {
// ... append html ...
// 先解綁再綁定
$('#tbody').off('click', '#Delete').on('click', '#Delete', function(){ ... });
}
$(function() {
// 1. 靜態按鈕直接綁定
$("#ADD, #Back, #add").on('click', function(){ ... });
// 2. 動態按鈕使用委派
$('#tbody').on('click', '.btn-delete', function() {
var $tr = $(this).closest('tr');
var data = $tr.find('td:last').data('data');
if (confirm('確定刪除 ' + data.record_title + '?')) {
$.post('delete.do', {id: data.id}, function(res){ ... });
}
});
$('#tbody').on('click', '.btn-edit', function() {
var data = $(this).closest('tr').find('td:last').data('data');
location.href = "Edit.html?id=" + data.id;
});
// 3. 載入資料
loadData();
});
function loadData() {
$.post(base_path + "/record/find.do", function(result) {
if (result.success) {
var html = '';
$.each(result.data, function(i, item) {
html += '<tr>'
+ '<td>' + item.record_title + '</td>'
+ '<td>' + item.record_time + '</td>'
+ '<td>' + item.record_man + '</td>'
+ '<td>' + item.record_content + '</td>'
+ '<td>' + item.record_comment + '</td>'
+ '<td>'
+ ' <button class="btn-edit">修改</button>'
+ ' <button class="btn-delete">刪除</button>'
+ '</td></tr>';
// 資料存在最後一個 td 的 data 中
});
$('#tbody').html(html).find('td:last').each(function(i) {
$(this).data('data', result.data[i]);
});
}
});
}
class 而非 id 標識動態按鈕(id 必須唯一)。#tbody 或 document)。.data() 而非 HTML 屬性,避免 XSS 與型別問題。