如何在jQuery DataTables中基于预定义列表批量选中指定行
解决方案:自动选中DataTables中的共性行
我来帮你实现这个需求——添加按钮自动选中预设的共性行,支持内部列表和外部文件两种方式,同时修正原代码里的小问题。
第一步:修正HTML结构问题
原HTML里有几个语法错误,先调整一下:
<!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" media="screen" /> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/select/1.3.0/css/select.dataTables.min.css" media="screen" /> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/buttons/1.5.6/css/buttons.dataTables.min.css" media="screen" /> <script charset="utf8" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script charset="utf8" src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script> <script charset="utf8" src="https://cdn.datatables.net/select/1.3.0/js/dataTables.select.min.js"></script> <script charset="utf8" src="https://cdn.datatables.net/buttons/1.5.6/js/dataTables.buttons.min.js"></script> <script charset="utf8" src="https://cdn.datatables.net/buttons/1.5.6/js/buttons.flash.min.js"></script> <script charset="utf8" src="https://cdn.datatables.net/buttons/1.5.6/js/buttons.html5.min.js"></script> <script charset="utf8" src="https://cdn.datatables.net/buttons/1.5.6/js/buttons.print.min.js"></script> <script charset="utf8" src="https://editor.datatables.net/extensions/Editor/js/dataTables.editor.min.js"></script> </head> <body> <div class="container"> <table id="samples" class="display nowrap compact hover dt-left" width="100%"></table> </div> <script type="text/javascript" charset="utf8" src="JS/datatables.js"></script> </body> </html>
- 移除了未闭合的空link标签
- 删除了多余的
</table>和</form>标签(原代码里没有对应的开标签)
第二步:实现内部列表自动选中按钮
在你的jQuery代码里,我们可以先定义一个内部共性行列表,然后添加按钮来匹配并选中这些行。核心逻辑是遍历表格行,对比Name/Region/Class/Category四个字段,匹配上就选中。
修改后的datatables.js代码:
$(document).ready(function () { // 内部维护的共性行列表 - 可以根据需求修改 const commonRows = [ {Name: 'Elmdale', Region: '6', Class : 'back', Category : 'circle'}, {Name: 'Rosebud', Region: '7', Class : 'back', Category : 'triangle'}, {Name: 'Letterkenny', Region: 'GO', Class : 'back', Category : 'square'} ]; var table = $('#samples').DataTable({ "processing": true, "serverSide": false, "pageLength": -1, "lengthMenu": [[100, 250, 500, -1], [100, 250, 500, "All"]], // 这里用你的ajax数据源,我暂时用示例数据演示 // ajax: "datatables.php", data: [ [0, '', '752', '7', 'unknown', 'unknown', 'yes'], [0, '', 'North 5th', 'NWA', 'unknown', 'square', 'yes'], [0, '', 'Elmdale', '6', 'back', 'circle', ''], [0, '', 'Rosebud', '7', 'back', 'triangle', ''], [0, '', 'Letterkenny', 'GO', 'back', 'square', ''], [0, '', '632nd', 'GO', 'front', 'ball', ''], [0, '', 'Water', '4', 'front', 'ball', ''], [0, '', 'Dirt', '1', 'front', 'mermaid', ''] ], columns: [ {data: 0, defaultContent: '0', visible: false }, {data: 1, defaultContent: '', orderable: false, className: 'select-checkbox', targets: 1 }, {title : 'Sample Name', 'className': 'dt-left', data: 2}, {title : 'Region/Program', 'className': 'dt-left', data: 3}, {title : 'Class', 'className': 'dt-left', data: 4}, {title : 'Category', 'className': 'dt-left', data: 5}, {title : 'QC Concerns', 'className': 'dt-left', data: 6} ], select: { style: 'multi', selector: 'td.select-checkbox' }, order: [[ 4, 'asc' ], [ 5, 'asc' ], [ 3, 'asc' ]], orderFixed: [0, 'desc'], dom: 'Bfrtip', buttons: [ { extend: 'excel', text: '<span class="fa fa-file-excel-o"></span> Download (ALL) or (SELECTED)', exportOptions: { columns: [ 2, 6 ], modifier: { search: 'applied', order: 'applied' } } }, // 新增:选中内部预设的共性行按钮 { text: 'Select Common Rows (Internal)', action: function (e, dt, node, config) { // 先清空现有选中 dt.rows().deselect(); // 遍历内部列表,匹配表格行并选中 commonRows.forEach(common => { dt.rows(function(idx, data, node) { // 对比四个字段:Name(2), Region(3), Class(4), Category(5) return data[2] === common.Name && data[3] === common.Region && data[4] === common.Class && data[5] === common.Category; }).select(); }); // 更新隐藏列的选中标记 dt.rows({ selected: true }).every(function() { this.cell(0).data('1'); }); dt.draw(); alert(`Selected ${dt.rows({ selected: true }).count()} common rows!`); } }, // 新增:加载外部文件选中共性行按钮 { text: 'Select Common Rows (From File)', action: function (e, dt, node, config) { // 创建临时文件上传控件 let input = $('<input type="file" accept=".json,.csv" style="display:none">'); $('body').append(input); input.on('change', function() { let file = this.files[0]; let reader = new FileReader(); reader.onload = function(e) { let content = e.target.result; let externalRows = []; // 处理JSON文件 if (file.type === 'application/json') { externalRows = JSON.parse(content); } // 处理CSV文件(假设第一行是表头:Name,Region,Class,Category) else if (file.type === 'text/csv') { let lines = content.split('\n'); let headers = lines[0].split(',').map(h => h.trim()); lines.slice(1).forEach(line => { if (line.trim()) { let values = line.split(',').map(v => v.trim()); let row = {}; headers.forEach((h, i) => row[h] = values[i]); externalRows.push(row); } }); } // 清空现有选中,匹配并选中外部列表行 dt.rows().deselect(); externalRows.forEach(common => { dt.rows(function(idx, data, node) { return data[2] === common.Name && data[3] === common.Region && data[4] === common.Class && data[5] === common.Category; }).select(); }); // 更新隐藏列标记 dt.rows({ selected: true }).every(function() { this.cell(0).data('1'); }); dt.draw(); alert(`Selected ${dt.rows({ selected: true }).count()} rows from file!`); input.remove(); }; reader.readAsText(file); }); input.click(); } }, { text: 'Use Selected Library', action: function ( e, dt, node, config) { let selectedData = dt.rows({ selected: true }).data().map(row => { return { Name: row[2], Category: row[5] }; }); // 这里可以用AJAX把数据传给PHP $.post('your-php-file.php', { data: selectedData }, function(response) { alert('Selected data sent to PHP successfully!'); }); } }, { text: 'Upload Predefined Library', action: function ( e, dt, node, conf ) { // 和上面的文件处理逻辑类似,这里可以把上传的文件内容传给PHP let input = $('<input type="file" accept=".json,.csv" style="display:none">'); $('body').append(input); input.on('change', function() { let file = this.files[0]; let formData = new FormData(); formData.append('library', file); $.ajax({ url: 'upload-library.php', type: 'POST', data: formData, processData: false, contentType: false, success: function(response) { alert('Library uploaded successfully!'); input.remove(); } }); }); input.click(); } } ] }); // 原有的选中/取消选中逻辑优化 table.on('select', function (e, dt, type, indexes) { if (type === 'row') { dt.rows(indexes).every(function() { this.cell(0).data('1'); }); dt.draw(false); // 用false避免重新排序 } }); table.on('deselect', function (e, dt, type, indexes) { if (type === 'row') { dt.rows(indexes).every(function() { this.cell(0).data('0'); }); dt.draw(false); } }); });
关键功能说明
内部共性行按钮
- 定义了
commonRows数组存储预设的共性行信息 - 点击按钮时先清空现有选中,再遍历表格行匹配四个字段,匹配成功就选中
- 同步更新隐藏列的选中标记(保持和原逻辑一致)
- 定义了
外部文件选中按钮
- 支持上传JSON或CSV格式的文件
- JSON文件格式要和
commonRows一致:[{Name: 'xxx', Region: 'xxx', Class: 'xxx', Category: 'xxx'}, ...] - CSV文件第一行需要是表头:
Name,Region,Class,Category,后续行是对应数据
- JSON文件格式要和
- 读取文件内容后,和内部列表逻辑一样匹配并选中行
- 支持上传JSON或CSV格式的文件
优化原有逻辑
- 修正了
select配置,添加selector: 'td.select-checkbox'确保点击复选框选中行 - 优化选中/取消选中时的隐藏列更新逻辑,支持批量操作
- 用
dt.draw(false)避免重新排序,提升体验
- 修正了
外部文件示例
JSON示例文件(common-rows.json)
[ {"Name": "Elmdale", "Region": "6", "Class": "back", "Category": "circle"}, {"Name": "Rosebud", "Region": "7", "Class": "back", "Category": "triangle"}, {"Name": "Water", "Region": "4", "Class": "front", "Category": "ball"} ]
CSV示例文件(common-rows.csv)
Name,Region,Class,Category Elmdale,6,back,circle Rosebud,7,back,triangle Water,4,front,ball
这样用户就可以通过按钮快速选中共性行,之后再手动增删剩余行,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

