【问题标题】:Checkbox "check/uncheck all" with pager DataTable带有寻呼机 DataTable 的复选框“选中/取消选中全部”
【发布时间】:2017-07-22 18:20:21
【问题描述】:

我有一个显示mysql寄存器的动态表(id, product, quantity, price),每个寄存器都有一个checkbox,另一个checkbox “check/uncheck all”是一个总和列表中的产品并显示在名为 totalinput:text 上。

动态表有一个分页器,因为它上传了很多数据库的寄存器,checkbox工作完美,并且求和,但它只是在第1页上做,当我切换到页面时2,这个是未标记的,我必须点击“check/uncheck all”才能标记第2页表格的所有复选框,并将实际页面的总和与最后一页,以此类推。

我想标记“check/uncheck all”checkbox,这样可以选择动态表所有页面的所有checkbox列表;

对不起,我的英语不好,谢谢。

我正在同时处理它的呼叫 DataTables 的寻呼机,这是我正在使用的代码:

let buys = document.getElementById('tbl-buys');
let cboxAll = buys.querySelector('thead input[type="checkbox"]');
let cboxes = buys.querySelectorAll('tbody input[type="checkbox"]');
let totalOutput = document.getElementById('total');
let total = 0;

[].forEach.call(cboxes, function (cbox) {
  cbox.addEventListener('change', handleRowSelect);
});

cboxAll.addEventListener('change', function () {
  [].forEach.call(cboxes, function (cbox) {
    //cbox.checked = cboxAll.checked;
    cbox.click();
  });
});

function handleRowSelect (e) {
  let row = e.target.parentNode.parentNode;
  let qty = row.querySelector('td:nth-child(3)').textContent;
  let price = row.querySelector('td:nth-child(4)').textContent;
  let cost = Number(qty) * Number(price);

  if (e.target.checked) {
    total += cost;
  } else {
    total -= cost;
  }

  total = Number(total.toFixed(2));
  totalOutput.value = total;
}

$(document).ready(function(){
    $('#tbl-buys').DataTable({
      "columnDefs": [ { orderable: false, targets: [0] }],
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="//cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet" href="//cdn.datatables.net/1.10.13/css/jquery.dataTables.min.css">

<table class="table table-striped table-bordered" data-page-length='2' id="tbl-buys">
  <thead>
    <tr>
      <th>
        <input type="checkbox"/>
      </th>
      <th>Producto</th>
      <th>Cantidad</th>
      <th>Precio</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>
        <input type="checkbox"/>
      </td>
      <td>Laptop Dell XPS 15</td>
      <td>1</td>
      <td>782.49</td>
    </tr>
    <tr>
      <td>
        <input type="checkbox"/>
      </td>
      <td>Mouse bluetooth solar</td>
      <td>1</td>
      <td>19.90</td>
    </tr>
    <tr>
      <td>
        <input type="checkbox"/>
      </td>
      <td>Sony Headphones 1000px</td>
      <td>1</td>
      <td>29.90</td>
    </tr>
    <tr>
      <td>
        <input type="checkbox"/>
      </td>
      <td>Intel x99</td>
      <td>1</td>
      <td>200.00</td>
    </tr>
  </tbody>
</table>

<label>Total</label>
<input type="text" id="total" class="form-control" readonly value="0.0" />

【问题讨论】:

  • 我正在使用存储在 JSON 数组中的数据来处理这个问题。所以在编码中,我使用 $.each 将 isChecked 添加到我的数据对象中,在分页中跟踪它。我使用了与您所做的类似的事件处理程序。我只需要添加逻辑来更新 html 表中的数据对象即可使其正常工作。如果你还需要这方面的帮助,我可以在 jsbin.com 完成并为你发布。
  • 您好,感谢您回答我。我已经尝试了 2 周来寻找解决方案,你能在 jsbin.com 上帮我解决这个问题吗? (对不起我的英语不好)。

标签: javascript php mysql checkbox datatable


【解决方案1】:

使用复选框插件,我不再需要跟踪复选框。 因为他的插件在选中时将一行标记为选中,所以我也不必再将数据标记为选中。

sum 函数简单地获取选定的行并对它们进行总计。我把总数放在工资栏的底部。

这段代码在我自己的环境中工作,但无法将其放入 jsbin,因为我正在使用 ajax 从我的机器上的 Web 服务获取数据。

我还使用了一个名为 autoNumeric 的不同插件来格式化总数。

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="//cdn.datatables.net/1.10.13/css/jquery.dataTables.min.css">
        <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
        <link href="https://gyrocode.github.io/jquery-datatables-checkboxes/1.0.4/css/dataTables.checkboxes.css" rel="stylesheet" />
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
        <script src="//cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"></script>
        <script src="//gyrocode.github.io/jquery-datatables-checkboxes/1.0.4/js/dataTables.checkboxes.js" type="text/javascript"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/autonumeric/1.9.46/autoNumeric.min.js" type="text/javascript"></script>
        <script>
            $(document).ready(function () {

                // the checkbox plugin selects the row when 
                // clicked so all this function has to do it get the selected rows.
                $.fn.dataTable.Api.register('sum()', function () {
                    var r = this.rows(".selected").data();
                    var total = 0;
                    $.each(r, function (i, it) {
                        total += it.salary;
                    });

                    // I put the number in the footer of the salary column
                    // using the autoNumeric plugin to format the amount.
                    $("#total").autoNumeric("set",total);
                });


                var table = $('#example').DataTable({
                    'processing': false,
                    // Again, this code will not work if serverSide is set to true.
                    'serverSide': false,
                    'ajax': {
                        // I used an asmx page in my own development environment to get the data.
                        url: 'wsService.asmx/GetDTDataSerializedList',
                        type: "post",
                        data: function(dtparms){
                            return JSON.stringify({ parameters: JSON.stringify(dtparms) });
                        },
                        contentType: "application/json; charset=utf-8",
                        dataFilter: function (dtData) {
                            var p = JSON.parse(dtData);
                            var d = JSON.parse(p.d);
                            return JSON.stringify({ data: d });
                        },
                    },
                    'columnDefs': [
                       {
                           'targets': 0,
                           'checkboxes': {
                           'selectRow': true
                           }
                       }

                    ],
                    'select': {
                        'style': 'multi'
                    },
                    'columns': [
                        { data: null },
                        { data: "name" },
                        { data: "position" },
                        { data: "office" },
                        { data: "extn" },
                        { data: "start_date" },
                        { data:"salary", className:".salary"}
                    ],
                    'order': [[1, 'asc']],
                    initComplete: function () {
                          $("#total").autoNumeric("init", { "currencySymbol": "$" });
                        $("#total").autoNumeric("set", 0);
                    }
                });


                // event handler for individual rows
                $("tbody" ).on("click","input[type=checkbox]", function () {
                    table.data().sum();
                });
                $("thead").on("click", "th input[type=checkbox]", function () {
                    table.data().sum();
                });

            });
        </script>
    </head>
    <body>
        <form>
            <div>
                <table class="display" id="example" cellspacing="0">
                    <thead>
                        <tr>
                            <th></th>
                            <th>Name</th>
                            <th>Position</th>
                            <th>Office</th>
                            <th>Extn.</th>
                            <th>Start date</th>
                            <th>Salary</th>
                        </tr>
                    </thead>
                    <tfoot>
                        <tr>
                            <th></th>
                            <th>Name</th>
                            <th>Position</th>
                            <th>Office</th>
                            <th>Extn.</th>
                            <th>Start date</th>
                            <th id="total"></th>
                        </tr>
                    </tfoot>
                </table>
            </div>
        </form>
    </body>
    </html>

【讨论】:

  • 您好,谢谢。我正在尝试使用您使用的 Ajax 代码,但它对我不起作用。
【解决方案2】:

我的解决方案会跟踪与数据表关联的数据对象中检查的内容和未检查的内容。

它使用 drawCallback 选项使显示的页面与数据对象保持同步。

我在数据表中添加了一个求和函数,用于对检查行的薪水列求和。

它在http://jsbin.com/joxiri/edit?html,js,output运行

    $(document).ready(function () {

        // Add function for summing salaries for rows that are checked
        $.fn.dataTable.Api.register('sum()', function () {
            var dtData = this;
            var total = 0;
            $.each(dtData, function (i, it) {
                if (it.isChecked) {
                    var a = parseFloat(it.salary.replace("$", "").replace(",", ""));
                    total += a;
                }
            });
            $("#total").val(total);
        });

        // Takes the dataset below and adds a value to track the isChecked status for the row.
        $.each(dataSet, function (i, it) { it.isChecked = false; });

        // Table definition
        var dtapi = $('#example').DataTable({
            data: dataSet,
            pageLength: 3,

            // We have the option of invalidating and redrawing the table on each checkox change or
            // as I did, use the drawCallback to set the checkbox to match the row data 
            "drawCallback": function (settings) {
                // not important on first draw so not worried about dtapi being defined on table initialization
                if (dtapi) {
                    var visibleRows = $("td.cbcell").closest("tr");
                    visibleRows.each(function (i, item) {
                        $("td.cbcell input", item).prop("checked", dtapi.rows(item).data()[0].isChecked);
                    })
                }
            },
            // this is the default but note that the drawCallback will not be called on each page change if set to true.
            "deferRender": false,
            "columnDefs": [],
            "order": [1],
            "columns": [
                {
                    "data": "isChecked",
                    // adding the class name just to make finding the checkbox cells eaiser
                    "class": "cbcell",
                    "orderable": false,
                    // Put the checkbox in the title bar
                    "title": "<input type='checkbox' />",
                    // puts the checkbox in each row
                    "render": function (dataItem) {
                        if (dataItem)
                            return "<input checked type='checkbox'/>";
                        else
                            return "<input type='checkbox'/>";
                    }
                },
                // rest of the columns
                { data: "first_name", title: "First Name" },
                { data: "last_name", title: "Last Name" },
                { data: "position", title: "Position" },
                { data: "office", title: "Office" },
                { data: "start_date", title: "Start date" },
                { data: "salary", title: "Salary" }
            ]
        });

        // This is the event handler for the check all checkbox
        $("th input[type=checkbox]").on("click", function () {
            var isChecked = this.checked
            var ld = $('#example').DataTable().rows().data();
            $.each(ld, function (i, item) {
                item.isChecked = isChecked;
            });
            $(".cbcell input").prop("checked", isChecked);
            dtapi.data().sum();
        })

        // event handler for individual rows
        $("#example").on("click", "td input[type=checkbox]", function () {
            var isChecked = this.checked;

            // set the data item associated with the row to match the checkbox
            var dtRow = dtapi.rows($(this).closest("tr"));
            dtRow.data()[0].isChecked = isChecked;

            // determine if the over all checkbox should be checked or unchecked
            if (!isChecked) {
                // if one is unchecked, then checkall cannot be checked
                $("th input[type=checkbox]").prop("checked", false);
            }
            else {
                $("th input[type=checkbox]").prop("checked", true);
                $.each(dtapi.data(), function (i, item) {
                    if (!item.isChecked) {
                        $("th input[type=checkbox]").prop("checked", false);
                        return false;
                    }
                });
            }

            dtapi.data().sum();
        });


    });

    // DataTable data set used
    var dataSet = [
    {
        "first_name": "Airi",
        "last_name": "Satou",
        "position": "Accountant",
        "office": "Tokyo",
        "start_date": "28th Nov 08",
        "salary": "$162,700"
    },
    {
        "first_name": "Angelica",
        "last_name": "Ramos",
        "position": "Chief Executive Officer (CEO)",
        "office": "London",
        "start_date": "9th Oct 09",
        "salary": "$1,200,000"
    },
    {
        "first_name": "Ashton",
        "last_name": "Cox",
        "position": "Junior Technical Author",
        "office": "San Francisco",
        "start_date": "12th Jan 09",
        "salary": "$86,000"
    },
    {
        "first_name": "Bradley",
        "last_name": "Greer",
        "position": "Software Engineer",
        "office": "London",
        "start_date": "13th Oct 12",
        "salary": "$132,000"
    },
    {
        "first_name": "Brenden",
        "last_name": "Wagner",
        "position": "Software Engineer",
        "office": "San Francisco",
        "start_date": "7th Jun 11",
        "salary": "$206,850"
    },
    {
        "first_name": "Brielle",
        "last_name": "Williamson",
        "position": "Integration Specialist",
        "office": "New York",
        "start_date": "2nd Dec 12",
        "salary": "$372,000"
    },
    {
        "first_name": "Bruno",
        "last_name": "Nash",
        "position": "Software Engineer",
        "office": "London",
        "start_date": "3rd May 11",
        "salary": "$163,500"
    },
    {
        "first_name": "Caesar",
        "last_name": "Vance",
        "position": "Pre-Sales Support",
        "office": "New York",
        "start_date": "12th Dec 11",
        "salary": "$106,450"
    },
    {
        "first_name": "Cara",
        "last_name": "Stevens",
        "position": "Sales Assistant",
        "office": "New York",
        "start_date": "6th Dec 11",
        "salary": "$145,600"
    },
    {
        "first_name": "Cedric",
        "last_name": "Kelly",
        "position": "Senior Javascript Developer",
        "office": "Edinburgh",
        "start_date": "29th Mar 12",
        "salary": "$433,060"
    }
    ]

【讨论】:

  • 非常感谢,它运行良好,我要将 MySQL 中的值加载到 DataTables 中。
  • 如果您正在运行 serverSide:true,则必须进行修改
  • 哦,是DataTable的插件吗?
  • 我一直在用DataTable checkboxes这个插件,但是不知道怎么做表格中所有选中产品的总和,并显示在input:text中。你能帮帮我吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多