【问题标题】:checkbox column selection issue in tabulator.jstabulator.js 中的复选框列选择问题
【发布时间】:2019-07-14 15:18:20
【问题描述】:

我正在使用 Tabulator.js v4.2.7,并且我有一个复选框列来选择行。此列标题有一个复选框来选择/取消选择所有行。

这工作正常。但是在单击标题复选框后,所有行都将被选中,如果我取消选中任何行复选框,则标题复选框不会被取消选中。

例如,如果我有 5 行并且如果我单击标题复选框,则所有 5 行都将被选中,现在如果我取消选中第二行复选框,剩余的 4 行仍将被选中,并且需要取消选中标题复选框。但是标题复选框并没有被取消选中。

这是我的复选框列代码:

{
    title: 'Select <br/> All <br/> <input type="checkbox" class="select-all-row" aria-label="select all rows" />',
    field: 'IsSelected',
    formatter: function(cell, formatterParams, onRendered) {
        return '<input type="checkbox" class="select-row" aria-label="select this row" />';
    },
    width: 50,
    headerSort: false,
    headerFilter: false,
    cssClass: 'text-center',
    frozen: true,
    tooltips: false,
    resizable: false,
    cellClick: function(e, cell) {
        var $element = $(cell.getElement());
        var $chkbox = $element.find('.select-row');
        if (cell.getData().IsSelected) {
            cell.getRow().deselect();
        } else {
            cell.getRow().select();
        }
        $chkbox.prop('checked', !cell.getData().IsSelected);
        cell.getData().IsSelected = !cell.getData().IsSelected;
    },
    headerClick: function(e, column) {
        if (column.getTable().getSelectedRows().length !== column.getTable().getDataCount()) {
            $('.select-row,.select-all-row').prop('checked', true);
            column.getTable().selectRow();
        } else {
            $('.select-row,.select-all-row').prop('checked', false);
            column.getTable().deselectRow();
        }
    }
}

请帮忙看看我哪里做错了。

谢谢,

阿卜杜勒

【问题讨论】:

  • 请将您的代码放在 Jsfiddle 或上面的工作 sn-p 中
  • @dota2pro 这是 JSFiddle 链接 - jsfiddle.net/86rp3tsk/1 我还在下面的答案中添加了链接。

标签: javascript checkbox tabulator


【解决方案1】:

经过几个小时的分析,我发现我错了。我通过在标题单击时为列中的所有单元格设置cell.getData().IsSelected 解决了问题,还添加了逻辑以根据计数取消选中单元格单击中的标题复选框。我也用香草javascript替换了Jquery代码这是答案:

这是工作的sn-p

var tabledata = [{
    id: 1,
    name: "Oli Bob",
    progress: 12,
    location: "United Kingdom",
    gender: "male",
    rating: 1,
    col: "red",
    dob: "14/04/1984",
    car: 1,
    lucky_no: 5,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 2,
    name: "Mary May",
    progress: 1,
    location: "Germany",
    gender: "female",
    rating: 2,
    col: "blue",
    dob: "14/05/1982",
    car: true,
    lucky_no: 10,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 3,
    name: "Christine Lobowski",
    progress: 42,
    location: "France",
    gender: "female",
    rating: 0,
    col: "green",
    dob: "22/05/1982",
    car: "true",
    lucky_no: 12,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 4,
    name: "Brendon Philips",
    progress: 100,
    location: "USA",
    gender: "male",
    rating: 1,
    col: "orange",
    dob: "01/08/1980",
    car: false,
    lucky_no: 18,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 5,
    name: "Margret Marmajuke",
    progress: 16,
    location: "Canada",
    gender: "female",
    rating: 5,
    col: "yellow",
    dob: "31/01/1999",
    car: false,
    lucky_no: 33,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 6,
    name: "Frank Harbours",
    progress: 38,
    location: "Russia",
    gender: "male",
    rating: 4,
    col: "red",
    dob: "12/05/1966",
    car: 1,
    lucky_no: 2,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 7,
    name: "Jamie Newhart",
    progress: 23,
    location: "India",
    gender: "male",
    rating: 3,
    col: "green",
    dob: "14/05/1985",
    car: true,
    lucky_no: 63,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 8,
    name: "Gemma Jane",
    progress: 60,
    location: "China",
    gender: "female",
    rating: 0,
    col: "red",
    dob: "22/05/1982",
    car: "true",
    lucky_no: 72,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 9,
    name: "Emily Sykes",
    progress: 42,
    location: "South Korea",
    gender: "female",
    rating: 1,
    col: "maroon",
    dob: "11/11/1970",
    car: false,
    lucky_no: 44,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 10,
    name: "James Newman",
    progress: 73,
    location: "Japan",
    gender: "male",
    rating: 5,
    col: "red",
    dob: "22/03/1998",
    car: false,
    lucky_no: 9,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 11,
    name: "Oli Bob",
    progress: 12,
    location: "United Kingdom",
    gender: "male",
    rating: 1,
    col: "red",
    dob: "14/04/1984",
    car: 1,
    lucky_no: 5,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 12,
    name: "Mary May",
    progress: 1,
    location: "Germany",
    gender: "female",
    rating: 2,
    col: "blue",
    dob: "14/05/1982",
    car: true,
    lucky_no: 10,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 13,
    name: "Christine Lobowski",
    progress: 42,
    location: "France",
    gender: "female",
    rating: 0,
    col: "green",
    dob: "22/05/1982",
    car: "true",
    lucky_no: 12,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 14,
    name: "Brendon Philips",
    progress: 100,
    location: "USA",
    gender: "male",
    rating: 1,
    col: "orange",
    dob: "01/08/1980",
    car: false,
    lucky_no: 18,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 15,
    name: "Margret Marmajuke",
    progress: 16,
    location: "Canada",
    gender: "female",
    rating: 5,
    col: "yellow",
    dob: "31/01/1999",
    car: false,
    lucky_no: 33,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 16,
    name: "Frank Harbours",
    progress: 38,
    location: "Russia",
    gender: "male",
    rating: 4,
    col: "red",
    dob: "12/05/1966",
    car: 1,
    lucky_no: 2,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 17,
    name: "Jamie Newhart",
    progress: 23,
    location: "India",
    gender: "male",
    rating: 3,
    col: "green",
    dob: "14/05/1985",
    car: true,
    lucky_no: 63,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 18,
    name: "Gemma Jane",
    progress: 60,
    location: "China",
    gender: "female",
    rating: 0,
    col: "red",
    dob: "22/05/1982",
    car: "true",
    lucky_no: 72,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 19,
    name: "Emily Sykes",
    progress: 42,
    location: "South Korea",
    gender: "female",
    rating: 1,
    col: "maroon",
    dob: "11/11/1970",
    car: false,
    lucky_no: 44,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 20,
    name: "James Newman",
    progress: 73,
    location: "Japan",
    gender: "male",
    rating: 5,
    col: "red",
    dob: "22/03/1998",
    car: false,
    lucky_no: 9,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 21,
    name: "Oli Bob",
    progress: 12,
    location: "United Kingdom",
    gender: "male",
    rating: 1,
    col: "red",
    dob: "14/04/1984",
    car: 1,
    lucky_no: 5,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 22,
    name: "Mary May",
    progress: 1,
    location: "Germany",
    gender: "female",
    rating: 2,
    col: "blue",
    dob: "14/05/1982",
    car: true,
    lucky_no: 10,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 23,
    name: "Christine Lobowski",
    progress: 42,
    location: "France",
    gender: "female",
    rating: 0,
    col: "green",
    dob: "22/05/1982",
    car: "true",
    lucky_no: 12,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 24,
    name: "Brendon Philips",
    progress: 100,
    location: "USA",
    gender: "male",
    rating: 1,
    col: "orange",
    dob: "01/08/1980",
    car: false,
    lucky_no: 18,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 25,
    name: "Margret Marmajuke",
    progress: 16,
    location: "Canada",
    gender: "female",
    rating: 5,
    col: "yellow",
    dob: "31/01/1999",
    car: false,
    lucky_no: 33,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 26,
    name: "Frank Harbours",
    progress: 38,
    location: "Russia",
    gender: "male",
    rating: 4,
    col: "red",
    dob: "12/05/1966",
    car: 1,
    lucky_no: 2,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 27,
    name: "Jamie Newhart",
    progress: 23,
    location: "India",
    gender: "male",
    rating: 3,
    col: "green",
    dob: "14/05/1985",
    car: true,
    lucky_no: 63,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 28,
    name: "Gemma Jane",
    progress: 60,
    location: "China",
    gender: "female",
    rating: 0,
    col: "red",
    dob: "22/05/1982",
    car: "true",
    lucky_no: 72,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 29,
    name: "Emily Sykes",
    progress: 42,
    location: "South Korea",
    gender: "female",
    rating: 1,
    col: "maroon",
    dob: "11/11/1970",
    car: false,
    lucky_no: 44,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 30,
    name: "James Newman",
    progress: 73,
    location: "Japan",
    gender: "male",
    rating: 5,
    col: "red",
    dob: "22/03/1998",
    car: false,
    lucky_no: 9,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 31,
    name: "Oli Bob",
    progress: 12,
    location: "United Kingdom",
    gender: "male",
    rating: 1,
    col: "red",
    dob: "14/04/1984",
    car: 1,
    lucky_no: 5,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 32,
    name: "Mary May",
    progress: 1,
    location: "Germany",
    gender: "female",
    rating: 2,
    col: "blue",
    dob: "14/05/1982",
    car: true,
    lucky_no: 10,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 33,
    name: "Christine Lobowski",
    progress: 42,
    location: "France",
    gender: "female",
    rating: 0,
    col: "green",
    dob: "22/05/1982",
    car: "true",
    lucky_no: 12,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 34,
    name: "Brendon Philips",
    progress: 100,
    location: "USA",
    gender: "male",
    rating: 1,
    col: "orange",
    dob: "01/08/1980",
    car: false,
    lucky_no: 18,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 35,
    name: "Margret Marmajuke",
    progress: 16,
    location: "Canada",
    gender: "female",
    rating: 5,
    col: "yellow",
    dob: "31/01/1999",
    car: false,
    lucky_no: 33,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 36,
    name: "Frank Harbours",
    progress: 38,
    location: "Russia",
    gender: "male",
    rating: 4,
    col: "red",
    dob: "12/05/1966",
    car: 1,
    lucky_no: 2,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 37,
    name: "Jamie Newhart",
    progress: 23,
    location: "India",
    gender: "male",
    rating: 3,
    col: "green",
    dob: "14/05/1985",
    car: true,
    lucky_no: 63,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 38,
    name: "Gemma Jane",
    progress: 60,
    location: "China",
    gender: "female",
    rating: 0,
    col: "red",
    dob: "22/05/1982",
    car: "true",
    lucky_no: 72,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 39,
    name: "Emily Sykes",
    progress: 42,
    location: "South Korea",
    gender: "female",
    rating: 1,
    col: "maroon",
    dob: "11/11/1970",
    car: false,
    lucky_no: 44,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 40,
    name: "James Newman",
    progress: 73,
    location: "Japan",
    gender: "male",
    rating: 5,
    col: "red",
    dob: "22/03/1998",
    car: false,
    lucky_no: 9,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 41,
    name: "Oli Bob",
    progress: 12,
    location: "United Kingdom",
    gender: "male",
    rating: 1,
    col: "red",
    dob: "14/04/1984",
    car: 1,
    lucky_no: 5,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 42,
    name: "Mary May",
    progress: 1,
    location: "Germany",
    gender: "female",
    rating: 2,
    col: "blue",
    dob: "14/05/1982",
    car: true,
    lucky_no: 10,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 43,
    name: "Christine Lobowski",
    progress: 42,
    location: "France",
    gender: "female",
    rating: 0,
    col: "green",
    dob: "22/05/1982",
    car: "true",
    lucky_no: 12,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 44,
    name: "Brendon Philips",
    progress: 100,
    location: "USA",
    gender: "male",
    rating: 1,
    col: "orange",
    dob: "01/08/1980",
    car: false,
    lucky_no: 18,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 45,
    name: "Margret Marmajuke",
    progress: 16,
    location: "Canada",
    gender: "female",
    rating: 5,
    col: "yellow",
    dob: "31/01/1999",
    car: false,
    lucky_no: 33,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 46,
    name: "Frank Harbours",
    progress: 38,
    location: "Russia",
    gender: "male",
    rating: 4,
    col: "red",
    dob: "12/05/1966",
    car: 1,
    lucky_no: 2,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 47,
    name: "Jamie Newhart",
    progress: 23,
    location: "India",
    gender: "male",
    rating: 3,
    col: "green",
    dob: "14/05/1985",
    car: true,
    lucky_no: 63,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 48,
    name: "Gemma Jane",
    progress: 60,
    location: "China",
    gender: "female",
    rating: 0,
    col: "red",
    dob: "22/05/1982",
    car: "true",
    lucky_no: 72,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 49,
    name: "Emily Sykes",
    progress: 42,
    location: "South Korea",
    gender: "female",
    rating: 1,
    col: "maroon",
    dob: "11/11/1970",
    car: false,
    lucky_no: 44,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
  {
    id: 50,
    name: "James Newman",
    progress: 73,
    location: "Japan",
    gender: "male",
    rating: 5,
    col: "red",
    dob: "22/03/1998",
    car: false,
    lucky_no: 9,
    lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing "
  },
];

var table = new Tabulator("#example-table", {
  data: tabledata,
  columns: [{
      title: 'Select <br/> All <br/> <input type="checkbox" class="select-all-row" aria-label="select all rows" />',
      field: 'IsSelected',
      formatter: function(cell, formatterParams, onRendered) {
        return '<input type="checkbox" class="select-row" aria-label="select this row" />';
      },
      width: 50,
      headerSort: false,
      headerFilter: false,
      cssClass: 'text-center',
      frozen: true,
      tooltips: false,
      resizable: false,
      cellClick: function(e, cell) {
        var element = cell.getElement();
        var chkbox = element.querySelector('.select-row');
        if (cell.getData().IsSelected) {
          cell.getRow().deselect();
          document.querySelector('.select-all-row').checked = false;
        } else {
          cell.getRow().select();
          if (cell.getColumn().getTable().getSelectedRows().length === cell.getColumn().getTable().getDataCount()) {
            document.querySelector('.select-all-row').checked = true;
          }
        }
        chkbox.checked = !cell.getData().IsSelected;
        cell.getData().IsSelected = !cell.getData().IsSelected;
      },
      headerClick: function(e, column) {
        if (column.getTable().getSelectedRows().length !== column.getTable().getDataCount()) {
          document.querySelectorAll('.select-row,.select-all-row').forEach(cb => cb.checked = true);
          column.getTable().selectRow();
        } else {
          document.querySelectorAll('.select-row,.select-all-row').forEach(cb => cb.checked = false);
          column.getTable().deselectRow();
        }
        column.getCells().forEach(cell => cell.getData().IsSelected = !cell.getData().IsSelected);
      }
    },
    {
      title: "Name",
      field: "name",
      width: 200
    },
    {
      title: "Progress",
      field: "progress",
      width: 100,
      align: "right",
      sorter: "number"
    },
    {
      title: "Gender",
      field: "gender",
      width: 100
    },
    {
      title: "Rating",
      field: "rating",
      align: "center",
      width: 80
    },
  ],
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/tabulator/4.2.7/css/tabulator.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/tabulator/4.2.7/js/tabulator.min.js"></script>
<div id="example-table"></div>

【讨论】:

  • @dota2Pro 感谢您提出编辑建议。当我发布答案时,我不知道如何格式化。感谢您的帮助。你赢得了我的尊重。如果您认为这是已接受的答案,请标记为已接受/支持答案。
  • 只有提出问题的人才能接受答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 2013-04-02
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
相关资源
最近更新 更多