DataTables:如果标题中有复选框和弹出控件,如何避免列排序?

2024-01-11

我有一个 DataTables 表,其中一些标题列中有复选框和弹出窗口。 (另外我也使用FixedColumn和ColReorder插件)。我在 jsfiddle 中的模型位于底部

我的问题是,如果用户尝试检查复选框或推送弹出窗口,排序事件就会接管一切。 jsfiddle 页面无法完全运行,因为在我的应用程序中,我收到了复选框单击的事件,但当时为时已晚,排序也会发生。 排序图标只是标题单元格的背景 CSS,排序事件由 DataTables 为整个标题单元格注册。

解决这个问题的计划:

  1. 注册处理程序并尝试阻止 Datatables 自己的处理程序运行。截至目前,如果我还为标题单元格注册了一个事件处理程序,那么我只会在 DataTable 的处理程序之后获取该事件,事件按注册顺序传递。我还为复选框和弹出窗口本身注册了处理程序,但这些处理程序也仅在 DataTables 的处理程序(冒泡)之后传递。 只有当我能够在 DataTables 自己的处理程序之前注册我的处理程序时,这才有效,但我还没有找到执行此操作的入口点。当事件注册时,表 DOM 应该已经生成。现在我看到时机已经晚了,我只能报名了。
  2. 找到一个 API 调用点,我可以在其中取消 DataTables 的排序。订单事件 (http://datatables.net/reference/event/order http://datatables.net/reference/event/order)似乎是事后,我看不到取消的方法。
  3. 在某些时候,我重组了非固定列标题以包含两行:顶行用于排序,底部包含我的复选框和弹出控件。这似乎有效,但事实证明它不适用于 ColReorder 插件。我需要那个插件,它只重新排序了标题的顶行,底部保留在那里。如果我能解决这个问题,这也将是一个解决方案。

http://jsfiddle.net/csabath/pgue1sf5/8/ 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
    });

我只阅读了问题的标题及其前 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 http://jsfiddle.net/pgue1sf5/15/,我只修复了第一个复选框/选择

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DataTables:如果标题中有复选框和弹出控件,如何避免列排序? 的相关文章

  • 如何在 Bootstrap 中将单选按钮设置为“选中”? [复制]

    这个问题在这里已经有答案了 我使用 Bootstrap 按钮作为单选按钮 http getbootstrap com javascript buttons http getbootstrap com javascript buttons 这
  • Bootstrap 页脚不在底部

    我试图强制我的页脚位于网站底部 我不希望它在滚动时粘住 只是在向下滚动网页时出现在底部 目前 网页显示时页脚位于内容下方 我添加了这样的代码bottom 0 并发现它粘住了并且不适合我的网站 我还添加了这样的代码html body heig
  • jquery 按钮点击背景颜色变化

    为什么这不起作用 jquery button click function go css background color yellow html table tr td hello td table gt tr table
  • 暂停或停止整页而不破坏

    我有一个正常滚动的页面 页面上有一个锚点 它会弹出一个模式 我在其中初始化 fullpage js 到目前为止 效果很好 但是当用户单击关闭图标时 我希望模式窗口关闭 并使 fullpage js 暂停或停止 以便禁用全页滚动效果 除非用户
  • execCommand 的替代品

    我希望创建一个所见即所得编辑器 使用 jQuery 作为框架 我可以使用不同的方法来简化生产 我现在确实有一个正在工作的编辑 而且运作良好 我使用 iFrame 并将其设计模式设置为打开并从那里开始 然而 有一些事情困扰着我 以更改所选文本
  • 如何使用 JQuery 创建新的 img 标签,并使用 JavaScript 对象中的 src 和 id?

    我从基本意义上了解 JQuery 但对它绝对是新手 并且怀疑这很容易 我在 JSON 响应中获得了图像 src 和 id 转换为对象 因此在 responseObject imgurl 和 responseObject imgid 中获得了
  • 帮助使用 jquery 验证插件和复选框

    我有一个复选框组 需要对其进行唯一命名 以将值单独存储在数据库中 但是 使用 jquery 验证插件 我无法验证名称不同的组
  • 如何在网页上显示进度条直到网页完全加载?

    我想在网页中显示进度条 加载弹出窗口 直到页面完全加载 我的网页很重 因为它包含一个 HTML 编辑器 这是一个基于 jQuery 的 HTML 编辑器 需要很多时间才能完全加载 在加载时 我希望在页面上显示一个进度条 该进度条将在整个页面
  • javascript中的实时文本颜色变化[重复]

    这个问题在这里已经有答案了 可能的重复 使用Jquery改变Textarea中某些单词的颜色 https stackoverflow com questions 2990157 change the color of certain wor
  • Jquery 获取 .val

    我需要的是 this 值 this attr value 出现在 这个 中 activities btn id val this val 这是代码 thoughts list click function this attr id this
  • twitter bootstrap typeahead 2.0.4 ajax 错误

    如果我使用 2 0 0 版本 我有以下代码肯定会返回正确的数据结果 但由于某种原因 bootstrap 的 typeahead 插件给了我一个错误 我将其粘贴在代码示例下方
  • 可以在 iPad 上自动播放 HTML5 视频吗?

    The
  • JSON 解析错误 - JSON 中位置 1 处出现意外标记 o

    我需要获取一个 JSON 对象并记录标题控制台以实现自动完成功能 我的 json 的示例如下 title Example 1 url http www example1 com title Example 2 url http www ex
  • onclick链接/按钮获取数据属性值

    span class btn btn block btn inverse btn icon glyphicons home i i Daily span span class btn btn block btn inverse btn ic
  • Backbone.View:delegateEvents 未将事件重新绑定到子视图

    我已将这个问题分解为尽可能小的示例 即 它只是为了演示问题 不一定代表现实世界的场景 假设我有一个父视图 此处为 MainView 其中包含一个子视图 此处为 SubView 如果在任何时候我需要重新渲染父视图 从而重新渲染子视图 我就会丢
  • Mousedown 事件与 ipad/iphone 的兼容性? - jQuery 移动

    我用jquery写了一个小卷轴 卷轴似乎在 PC 和 Mac 上都能完美运行 但它不适用于触摸设备 我想这是由于mousedown被调用的属性 如何在 PC 和触摸屏设备上实现此功能 Thanks scroll nav up scroll
  • jquery 自动完成额外参数

    我使用 jquery 自动完成 我可以将 extraParams 传递给 asp net 中的 webservice 吗 我的 WebMethod 将如何获得它 您传递一个额外的参数函数 如下所示 controlId setOptions
  • Bootstrap 多选限制问题

    我使用创建了一个多选下拉列表引导多选 http davidstutz github io bootstrap multiselect 我需要在选项选择中设置一个限制 这里我将其设置为 5 如果达到限制 我只需禁用其他选择选项 它就可以完美工
  • jQuery 分钟和秒倒计时器

    我想创建一个 jquery 倒计时器 我尝试了以下代码 但它不起作用 我该怎么办 DEMO https jsfiddle net tbosn210 https jsfiddle net tbosn210 var interval setIn
  • 删除移动设备上的 adsense

    我正在研究响应式设计 但在使用 adsense 时遇到了问题 我有一个广告应该显示在桌面设计上 但不能显示在移动设计上 因此 只有在桌面上查看网站时 才应将广告代码放置在 html 中 css 可以使用 display none 但这违反了

随机推荐