数据表:我怎样才能避免列排序,如果我有复选框,并弹出控制在头?(DataTables: how ca

2019-10-20 22:48发布

我有一个数据表的表,其中有复选框和弹出窗口中的一些标题列。 (另外,我使用FixedColumn和ColReorder插件太)。 什么我有一个的jsfiddle实物模型是在底部

我的问题是,如果用户尝试检查复选框或推弹出窗口,分拣事件接管一切。 该页面的jsfiddle没有完全发挥作用,因为在我的应用我收到事件的复选框点击,但它是在那个时候为时已晚,排序也发生了。 排序图标只是为标题单元格背景CSS和排序事件被登记作为数据表整个头单元格。

计划来解决这个问题:

  1. 注册处理程序,并试图阻止数据表自己的处理程序的运行。 截至目前,如果我还注册了头细胞的事件处理程序,我会得到之后才DataTable的处理程序,这些事件在注册顺序传递的事件。 我也注册了该复选框,并在弹出的本身处理,但只有在数据表的处理这些也传送(冒泡)。 如果我能以某种方式之前,数据表自己的处理程序来注册我处理这只能工作,但我还没有找到一个切入点来做到这一点。 该表DOM应该已经产生,当登录的事件。 现在,我看到过晚的场合,我只能注册。
  2. 找到一个API调用地步,我可以取消数据表的排序。 订单事件( http://datatables.net/reference/event/order )似乎是事实后,我看不到取消的方式。
  3. 在某些时候,我重新调整了非固定列标题包含两行:最上面一行是为排序和底部载我checbox和弹出控制。 这似乎只是它横空出世,它不与ColReorder插件努力工作。 我需要的插件,并且只重新排序标题的最上面一行,底部在那里呆了。 如果我能解决这个问题,这将是一个解决方案也。

http://jsfiddle.net/csabatoth/pgue1sf5/8/

var initPage = function () {
    var columnsArray = [
        { "title": "index", "class": "dt-center" },
        { "title": "lastname", "class": "dt-head-center dt-body-left" },
        { "title": "firstname", "class": "dt-head-center dt-body-left" },
        { "title": '<div>foo1</div><input type="checkbox" class="filterchk" checked="checked">&nbsp;<select class="paramsel"><option value="1" selected="selected"/><option value="2"/><option value="3"/></select>', "class": "dt-head-center dt-body-left" },
        { "title": '<div>foo2</div><input type="checkbox" class="filterchk" checked="checked">&nbsp;<select class="paramsel"><option value="1" selected="selected"/><option value="2"/><option value="3"/></select>', "class": "dt-center rulecolumn" },
        { "title": '<div>foo3</div><input type="checkbox" class="filterchk" checked="checked">&nbsp;<select class="paramsel"><option value="1" selected="selected"/><option value="2"/><option value="3"/></select>', "class": "dt-center rulecolumn" },
        { "title": '<div>foo4</div><input type="checkbox" class="filterchk" checked="checked">&nbsp;<select class="paramsel"><option value="1" selected="selected"/><option value="2"/><option value="3"/></select>', "class": "dt-center rulecolumn" },
        { "title": '<div>bar1</div><input type="checkbox" class="filterchk" checked="checked">&nbsp;<select class="paramsel"><option value="1" selected="selected"/><option value="2"/><option value="3"/></select>', "class": "dt-center rulecolumn" },
        { "title": '<div>bar2</div><input type="checkbox" class="filterchk" checked="checked">&nbsp;<select class="paramsel"><option value="1" selected="selected"/><option value="2"/><option value="3"/></select>', "class": "dt-center rulecolumn" },
        { "title": '<div>bar3</div><input type="checkbox" class="filterchk" checked="checked">&nbsp;<select class="paramsel"><option value="1" selected="selected"/><option value="2"/><option value="3"/></select>', "class": "dt-center rulecolumn" }
    ];

    var dataArray = [
        [ 1, "aaa", "rrr", "x", "x", "x", "x", "x", "x", "x" ],
        [ 2, "bbb", "qqq", "x", "x", "x", "x", "x", "x", "x" ],
        [ 3, "ccc", "ppp", "x", "x", "x", "x", "x", "x", "x" ],
        [ 4, "ddd", "ooo", "x", "x", "x", "x", "x", "x", "x" ],
        [ 5, "eee", "nnn", "x", "x", "x", "x", "x", "x", "x" ],
        [ 6, "fff", "mmm", "x", "x", "x", "x", "x", "x", "x" ],
        [ 7, "ggg", "lll", "x", "x", "x", "x", "x", "x", "x" ],
        [ 8, "hhh", "kkk", "x", "x", "x", "x", "x", "x", "x" ],
        [ 9, "iii", "jjj", "x", "x", "x", "x", "x", "x", "x" ]
    ];

    viewModel.table = $('#MyTable').DataTable({
        dom: "Rrtip",
        autoWidth: false,
        deferRender: true,
        info: true,
        lengthChange: false,
        ordering: true,
        orderMulti: true,
        orderFixed: {
            pre: [0, 'asc'],
            post: [1, 'asc']
        },
        paging: true,
        pagingType: "full_numbers",
        renderer: "bootstrap",
        processing: true,
        scrollX: true,
        scrollY: false,
        searching: false,
        columns: columnsArray,
        data: dataArray,
        initComplete: function (settings, json) {
            viewModel.attachTableEventHandlers();
        },
        displayLength: 5,
        colReorder: {
            fixedColumnsLeft: 3,
            fixedColumnsRight: 0
        }
    });
    new $.fn.dataTable.FixedColumns(viewModel.table, {
        leftColumns: 3
    });

Answer 1:

我已阅读了问题,它的第一个3线(所以我希望它能帮助)的只有标题,但如果所有你需要的是停止点击甚至位于表头内点击复选框中的传播你应该添加onclick="event.stopPropagation()"到该复选框,或者更好的是将在IE(旧)和其他浏览器的功能

//taken from my yadcf plugin, you can call it in your code like this:
//yadcf.stopPropagation(event)
function stopPropagation(evt) {
    if (evt.stopPropagation !== undefined) {
        evt.stopPropagation();
    } else {
        evt.cancelBubble = true;
    }
}

并在复选框中添加onclick="stopPropagation(event)"

你的选择,你还应该添加onmousedown="..."所以它是这样的:

<select onclick="event.stopPropagation()"  
        onmousedown="event.stopPropagation()"

这里是一个工作的jsfiddle ,我只固定在第一个复选框/选择



Answer 2:

要重申我的尝试:

  1. 我无法阻止自己的数据表,从注册到点击事件,或劫持该点击。
  2. 我也没有找到API,我可以阻止它。
  3. 复杂的头部首先看起来像一个很好的解决方案,直到我意识到,它不与ColReorder工作。

所以,我能想到的唯一方法是深呼吸和破解数据表本身:

function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
{
    return;

所以我添加了return语句的函数体的开始。 这将防止听者的附件。 我离开返回下面的unaccessable代码造成的改动较小越好。 伴随着这种问题:

  1. 我每次升级数据表,我需要重复这个技巧。
  2. 我需要太执行对最小化版本的劈: function Ka(a,b,c,d){return;var e=a.aoColumns[c];Ta(b ...
  3. 现在,点击不工作,我需要附上我自己的听众,并调用编程的排序,如果点击是不是输入元素上。

     $('.dataTables_scrollHead thead th').on('click', function (e) { if ($(e.target).hasClass("yadcf-filter-reset-button") || $(e.target).hasClass("paramchk") || $(e.target).hasClass("paramsel") || $(e.target).is("option")) return; var colIdxStr = $(this).attr("data-column-index"); var colIdx = parseInt(colIdxStr, 10); viewModel.sortColumn(colIdx, e.shiftKey); }); 

你在这里看到的标有“paramsel”类yacdf过滤器或弹出窗口(“选项”)或编辑框的组合由我或检查标记为“paramchk”类通过将接收click事件框,我不排序。 。 但除此之外,我需要以编程方式进行排序。 下面的代码甚至试图如果换档键被按下,以支持多个列排序。

viewModel.sortColumn = function (colIdx, shiftPressed) {
    var order = viewModel.table.order();
    var direction = "";
    for (var i = 0; i < order.length; i++) {
        if (order[i][0] == colIdx) {
            direction = order[i][1];
            break;
        }
    }
    if (direction === "")
        direction = "desc";
    else if (direction === "desc")
        direction = "asc";
    else
        direction = "";
    if (shiftPressed) {
        order.push([colIdx, direction]);
        viewModel.table.order(order).draw();
    } else {
        viewModel.table.order([colIdx, direction]).draw();
    }
}

一个更需要的一块是装饰头部细胞与列索引:

viewModel.table = $('#reportTable').DataTable({
    ...
    headerCallback: function (thead, data, start, end, display) {
        $(thead).find("th").each(function (thindex, thelement) {
            $(thelement).attr("data-column-index", thindex);
        });
    }
});

这一切到底是这么复杂,那请不要犹豫,告诉我,如果可以变得简单,或者您知道任何形式的高雅或其它溶液。



Answer 3:

不知道这会有所帮助,但我是在一个类似的情况 - 我的头包含一个下拉按钮,打开一个滑块.dropdown窗格窗格元素。 每个移动滑块会造成列排序。 我绝望了,写了将近100行试图解除绑定和覆盖此行为。 最后我要么禁用这两个分类和滑盖的preventDefault()(显然,不解决方案),或者什么都不会在所有的工作。 出人意料的是,错误和试验的几个小时后,我发现这工作:

$('.dropdown-pane').click(function() {
return false;
}); 


文章来源: DataTables: how can I avoid column sorting if I have checkbox and popup controls in the header?