You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tabulator表格:如何实现仅通过复选框进行多行选择?

Tabulator 行选择控制解决方案

问题1:selectable = false 时实现复选框多行选择

当关闭Tabulator自带的行选择机制(selectable: false),需要手动实现复选框的多选逻辑,不依赖内置选择功能:

  • 自定义行和表头的复选框渲染逻辑
  • 维护数组存储选中的行ID
  • 处理单个复选框点击事件和表头全选/全不选逻辑

完整代码示例

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tabulator/5.5.2/css/tabulator.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/tabulator/5.5.2/js/tabulator.min.js"></script>
<div id="tableDiv"></div>

<script>
var tableDiv = document.querySelector("#tableDiv");

var tableData = [
    {id:1, name:"Oli Bob", age:"12", col:"red", dob:""},
    {id:2, name:"Mary May", age:"1", col:"blue", dob:"14/05/1982"},
    {id:3, name:"Christine Lobowski", age:"42", col:"green", dob:"22/05/1982"},
    {id:4, name:"Brendon Philips", age:"125", col:"orange", dob:"01/08/1980"},
    {id:5, name:"Margret Marmajuke", age:"16", col:"yellow", dob:"31/01/1999"},
];

var selectedRows = []; // 存储选中的行ID

var columnConfig = [
    {
        title: "",
        formatter: function(cell) {
            // 渲染行内复选框
            const checkbox = document.createElement('input');
            checkbox.type = 'checkbox';
            checkbox.checked = selectedRows.includes(cell.getRow().getData().id);
            
            checkbox.addEventListener('change', function() {
                const rowId = cell.getRow().getData().id;
                if(this.checked) {
                    !selectedRows.includes(rowId) && selectedRows.push(rowId);
                } else {
                    selectedRows = selectedRows.filter(id => id !== rowId);
                }
                updateHeaderCheckbox();
            });
            
            return checkbox;
        },
        titleFormatter: function() {
            // 渲染表头全选复选框
            const headerCheckbox = document.createElement('input');
            headerCheckbox.type = 'checkbox';
            
            headerCheckbox.addEventListener('change', function() {
                selectedRows = this.checked ? tableData.map(item => item.id) : [];
                // 更新所有行的复选框状态
                myTable.getRows().forEach(row => {
                    const checkbox = row.getCell(0).getElement().querySelector('input');
                    checkbox && (checkbox.checked = this.checked);
                });
            });
            
            return headerCheckbox;
        },
        hozAlign: "center",
        headerSort: false,
        width: 50
    },
    {title:"Name", field:"name", width:150},
    {title:"Age", field:"age", hozAlign:"left", formatter:"progress"},
    {title:"Favourite Color", field:"col"},
    {title:"Date Of Birth", field:"dob", sorter:"date", hozAlign:"center"},
];

var myTable = new Tabulator(tableDiv, {
    data: tableData,
    columns: columnConfig,
    selectable: false,
    rendered: function() {
        updateHeaderCheckbox();
    }
});

// 同步表头复选框状态
function updateHeaderCheckbox() {
    const headerCheckbox = myTable.getHeader().getCell(0).getElement().querySelector('input');
    if(headerCheckbox) {
        headerCheckbox.checked = selectedRows.length === tableData.length && tableData.length > 0;
    }
}
</script>

问题2:selectable = true 时仅允许复选框触发行选择

开启内置行选择(selectable: true)后,通过beforeSelect回调限制只有复选框触发选择,点击其他单元格时阻止选择行为:

  • 保留rowSelection列配置
  • 在beforeSelect中判断触发源是否为复选框,非复选框触发则返回false阻止选择
  • 可选:点击其他单元格时取消当前行选中状态(按需调整)

完整代码示例

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tabulator/5.5.2/css/tabulator.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/tabulator/5.5.2/js/tabulator.min.js"></script>
<div id="tableDiv"></div>

<script>
var tableDiv = document.querySelector("#tableDiv");

var tableData = [
    {id:1, name:"Oli Bob", age:"12", col:"red", dob:""},
    {id:2, name:"Mary May", age:"1", col:"blue", dob:"14/05/1982"},
    {id:3, name:"Christine Lobowski", age:"42", col:"green", dob:"22/05/1982"},
    {id:4, name:"Brendon Philips", age:"125", col:"orange", dob:"01/08/1980"},
    {id:5, name:"Margret Marmajuke", age:"16", col:"yellow", dob:"31/01/1999"},
];

var columnConfig = [
    {
        title: "",
        formatter: "rowSelection",
        titleFormatter: "rowSelection",
        hozAlign: "center",
        headerSort: false,
        width: 50
    },
    {title:"Name", field:"name", width:150},
    {title:"Age", field:"age", hozAlign:"left", formatter:"progress"},
    {title:"Favourite Color", field:"col"},
    {title:"Date Of Birth", field:"dob", sorter:"date", hozAlign:"center"},
];

var myTable = new Tabulator(tableDiv, {
    data: tableData,
    columns: columnConfig,
    selectable: true,
    // 阻止非复选框触发的行选择
    beforeSelect: function(row, e) {
        const isCheckbox = e.target.type === 'checkbox';
        const isHeaderCheckbox = e.target.closest('.tabulator-header') && e.target.type === 'checkbox';
        return isCheckbox || isHeaderCheckbox;
    },
    // 可选:点击其他单元格时取消该行选中状态(不需要可注释)
    rowClick: function(e, row) {
        const isCheckbox = e.target.type === 'checkbox';
        const isHeaderArea = e.target.closest('.tabulator-header');
        if(!isCheckbox && !isHeaderArea) {
            row.deselect();
        }
    }
});
</script>

内容的提问来源于stack exchange,提问作者The One

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:18:11