每分鐘輪詢後端 API,若每次都 $('#table').html('') 重建整張表格,會導致:
核心原則:結構不變,只更新內容。
function refreshTable() {
$.getJSON('/api/data', function(rows) {
// 1. 表格骨架已存在於 HTML,僅更新 tbody
var $tbody = $('#dataTable tbody');
// 2. 建立映射:現有行 ID → 行元素 (假設第一欄為唯一 ID)
var existingRows = {};
$tbody.find('tr[data-id]').each(function() {
existingRows[$(this).data('id')] = this;
});
// 3. 遍歷新資料,更新或建立
rows.forEach(function(row) {
var tr = existingRows[row.id];
if (tr) {
// 更新現有行
$(tr).find('td:eq(1)').text(row.name);
$(tr).find('td:eq(2)').text(row.value);
// 標記已處理
delete existingRows[row.id];
} else {
// 新增行
var html = '<tr data-id="' + row.id + '">' +
'<td>' + row.id + '</td>' +
'<td>' + row.name + '</td>' +
'<td>' + row.value + '</td>' +
'</tr>';
$tbody.append(html);
}
});
// 4. 移除舊資料中已不存在的行
$.each(existingRows, function(id, tr) {
$(tr).remove();
});
});
}
// 初始化:首次載入建立骨架
$(function() {
refreshTable();
setInterval(refreshTable, 60000); // 每分鐘
});
{{ row.id }}
{{ row.name }}
{{ row.value }}
框架內建 Virtual DOM Diff,開發者只需維護資料陣列,DOM 更新自動最小化。
.text() 寫入。AbortController 或旗標避免競態條件。