在使用 jQuery DataTable 實現的表格中,擁有「狀態」與「在線」兩個下拉列表,需實現兩者聯動篩選:選擇狀態後,在線下拉選項動態更新;反之亦然。要求前端純 JavaScript 實現,無需後端配合。
<select> 的 change 事件// 假設表格 ID 為 example,狀態下拉 ID 為 filterStatus,在線下拉 ID 為 filterOnline
var table = $('#example').DataTable();
var allData = table.rows({search:'applied'}).data().toArray(); // 緩存當前顯示資料
function rebuildOnlineOptions(selectedStatus) {
var onlineSet = new Set();
allData.forEach(function(row) {
if (!selectedStatus || row.status === selectedStatus) {
onlineSet.add(row.online);
}
});
var $online = $('#filterOnline');
$online.empty().append('');
onlineSet.forEach(function(val) {
$online.append('');
});
}
$('#filterStatus').on('change', function() {
var status = $(this).val();
rebuildOnlineOptions(status);
table.column(2).search(status).draw(); // 假設狀態在第 3 列
});
$('#filterOnline').on('change', function() {
var online = $(this).val();
table.column(3).search(online).draw(); // 假設在線在第 4 列
});
// 初始化
rebuildOnlineOptions('');
若資料量極大,建議改用 $.fn.dataTable.ext.search 自訂過濾函數,避免重複遍歷 DOM:
$.fn.dataTable.ext.search.push(function(settings, data, dataIndex) {
var status = $('#filterStatus').val();
var online = $('#filterOnline').val();
if (status && data[2] !== status) return false;
if (online && data[3] !== online) return false;
return true;
});
$('#filterStatus, #filterOnline').on('change', function() {
table.draw();
});
success 回調中重新初始化 DataTable 或調用 table.draw()$.fn.dataTable.ext.search.pop()