datatables實現複選框全選反選!!(親測有效)

關於datatables的全選和反選實現
html部分:

<table data-toggle="table" class="table table-bordered text-center table-hover" id="customTable">
            <thead>
            <tr class="tr1">
                <th class='th'>
                    <input type="checkbox" class="checkall" />
                </th>
                <th>員工工號</th>
                <th>姓名</th>
                <th>登錄賬號</th>
                <th>手機號</th>
                <th>部門</th>
                <th>狀態</th>
                <th>操作</th>
            </tr>
            </thead>
            <tbody>
            </tbody>
        </table>

js部分:

var app = new Vue({
    el:'#app',
    data:{
        loginId:localStorage.loginId,
        token:localStorage.token,
        idList:[], //選中的value值即id插入到一個數組中
        // allIdList:[], //點擊全選獲取到的id
        checkedData:'',//選中的每個複選框value值

    },
    /**
     * 頁面加載完成要做的事
     * */
    mounted: function () {
        this.showCustomList();
    },
    methods: {
        /**
         * 頁面初始化做的事兒
         * */
        showCustomList:function() {
            var that = this;
            $('#customTable').DataTable({
                bLengthChange: false, //去掉每頁顯示多少條數據方法
                "info": false, //去掉底部文字
                "lengthMenu": [[10, 30, 50, 100], [10, 30, 50, 100]], //分頁長度選項,   -1 "全部"  暫時取消
                "paging": true, //分頁
                "ordering": false, //排序
                "bSort": false,     //排序
                "bFilter": true, //過濾功能
                "order": [], //[[ 1, "desc" ]]默認排序 第三列
                iDisplayLength: 10,
                destroy: true, //如果需要重新加載的時候請加上這個
                "pagingType": "full_numbers", //分頁樣式
                "bStateSave": true, //當前頁碼緩存
                "bDeferRender": true,        //     *  當該屬性設置爲true時,表格每一行新增的元素只有在需要被畫出來時纔會被DataTable創建出來
                //"scrollY": "auto", //設置高度
                //"scrollCollapse": true, //超出 滑動
                "bJQueryUI": true,      //      是否啓用jQueryUI樣式
                bProcessing: false,   //加載動畫
                "bServerSide": true, //服務端分頁
//            "aaSorting": [[4, "desc"]],
                searching: false, //禁用原生搜索
                "language": { //語言配置
                    "sSearch": "搜索",
                    "sLengthMenu": "每頁顯示 _MENU_ 條記錄",
                    "sZeroRecords": "沒有檢索到數據",
                    "sInfo": "第 _START_ 至 _END_ 條數據 &nbsp;&nbsp;共 _TOTAL_ 條",
                    "sInfoEmpty": "沒有數據",
                    "sProcessing": "<img src='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1511524485514&di=7914d6ce1d41cf99f546d04b0c6c3133&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01e423569d041532f875520fd65760.gif'/>", //這裏是給服務器發請求後到等待時間顯示的 加載gif
                    "sInfoFiltered": "(篩選自 _MAX_ 條數據)",
                    "oPaginate": {
                        "sFirst": "首頁",
                        "sPrevious": "前一頁",
                        "sNext": "後一頁",
                        "sLast": "末頁"
                    }
                },
                //"info": true, //通知
                ajax: function (data, callback, settings) {
                    var param = {};
                    //如果需要分頁(後端分頁)
                    param.pageSize = data.length;//頁面顯示記錄條數,在頁面顯示每頁顯示多少項的時候
                    param.startRow = data.start;//開始的記錄序號
                    param.pageNum = (data.start / data.length)+1;//當前頁碼
                    //ajax請求數據
                    $.ajax({
                        url:"",  //接口
                        type:'post',
                        dataType:'json',
                        data:param,
                        success:function (res) {
                            checkToken(res);
                            if(res.code == 200){
                                // console.log(res)
                                 $(".checkall").prop("checked", false);  //每次翻頁全選框不選中
                                // console.log(res)
                                that.pageNum = res.data.pageInfo.size; //每頁顯示的數據
                                var returnData = {};
                                returnData.draw = data.draw;//這裏直接自行返回了draw計數器,應該由後臺返回
                                returnData.recordsTotal = res.data.pageInfo.total;//返回數據全部記錄
                                returnData.recordsFiltered = res.data.pageInfo.total;//後臺不實現過濾功能,每次查詢均視作全部結果
                                returnData.data = res.data.pageInfo.list;//返回的數據列表
                                callback(returnData);
                            }else{
                                layer.msg(res.msg);
                            }
                        }
                    });
                },
                columns: [
                    //複選框(通過render渲染複選框)
                    {
                        "data": null,
                        "bSortable": false,
                        render: function (data, type, full, meta) {
                            var node = '';
                            node = '<input class="checkchild" οnclick="selectList(this)" value=\"'+full.id+'\" type="checkbox"/>';
                            return node;
                        }
                    },
                    //員工工號
                    {
                        "data": "empCode",
                        "bSortable": false
                    },
                    //姓名
                    {
                        "data": "userName",
                        "bSortable": false
                    },
                    //登錄賬號
                    {
                        "data": "loginId",
                        "bSortable": false
                    },
                    //手機號
                    {
                        "data": "phoneNum",
                        "bSortable": false
                    },
                    //部門
                    {
                        "data": "groupName",
                        "bSortable": false
                    },
                    //狀態
                    {
                        "data": "useSign",
                        "bSortable": false,
                    },
                    //操作
                    {
                        "data": "",
                        "bSortable": false,
                        "render": function (data, type, full, meta) {
                            var node = '';
                            node = '<div class="tableBtns">' +
                                '<a class="tableBtn" href="javaScript:;">查看</a>' +
                                '<a class="tableBtn" href="javaScript:;">編輯</a>' +
                                '<a class="tableBtn" href="javaScript:;">日誌</a>'
                            '</div>';
                            return node;

                        }
                    }
                ],
            });
            //點擊全選按鈕
            $('.checkall').on('click', function () {
            //我的需求是要把全選選中的相關內容的id以數組的形式傳給後端。在點擊全選之前先初始化一下數組
                that.idList=[]
                //如果全選框時選中狀態
                if($(this).prop('checked')) {
                //則它下面的複選框爲選中狀態
                    $(".checkchild").prop("checked", true);
                    //聲明選中的複選框,並遍歷
                    var allChecked = $('.checkchild:checked');
                    for(var i= 0;i<allChecked.length;i++){
                    //因爲傳給後端的數據id具有唯一性,所以只要保證數組不重複,
                    //就可以保證在先點擊其下複選框再點擊全選按鈕的時候id被重複添加進數組中的問題
                        if(that.idList.indexOf($(allChecked[i]).val())==-1){
                            that.idList.push($(allChecked[i]).val())
                        }
                    }
                    console.log(that.idList)
                } else {
                //如果全選框爲非選中狀態時,其下的複選框全部變爲非選中狀態
                    $(".checkchild").prop("checked", false);
                    //並把原數組清空
                    that.idList=[]
                }
            });
        },
       
    }
});

每個複選框的點擊事件:

function selectList(_this) {
    app.checkedData = $($(_this)[0]).val();
    if($($(_this)[0]).prop('checked')){
        if(app.idList.indexOf(app.checkedData)==-1){
            app.idList.push(app.checkedData)
            console.log(app.idList)
            if($('.checkchild:checked').length===app.pageNum){
            //如果單個複選框全部選中,全選框也選中
                $(".checkall").prop("checked", true);
            }
        }
    }else {
        $(".checkall").prop("checked", false);
        app.idList.map((item,index)=>{
            if(item == app.checkedData){
                app.idList.splice(index,1)
            }
            console.log(app.idList)
        })
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章