在 DataTables 中使用 HTML 对数值数据进行排序

Posted

技术标签:

【中文标题】在 DataTables 中使用 HTML 对数值数据进行排序【英文标题】:Sort numeric data with HTML in DataTables 【发布时间】:2017-07-26 21:33:30 【问题描述】:

我正在使用 DataTables 插件版本 1.10.13。在我的表中,索引5 处的列包含一个引导进度条,生成的 html 看起来有点像这样:

<td>
    <div class="progress"
           style="margin-bottom:0px;"
           title="10% Complete"
             data-placement="top"
             data-toggle="popover"
             data-trigger="hover"
             data-html="true"
             data-content="
                Some data here...
             "
    >
      <div class="progress-bar " role="progressbar" aria-valuenow="10"
           aria-valuemin="0" aria-valuemax="100" style="width: 10%;">
        <span class="sr-only">10</span>
      </div>
    </div>
</td>

现在,没有任何选项,DataTables 按字母顺序对这些列进行排序,因此进度条为 90 的记录位于最顶部,而具有 100、10 和最后为 0 的记录位于底部。问题是 100 应该在最顶端。

我尝试了html-numhtml-num-fmtnum 和其他几个,但它们要么不起作用,要么按字母顺序排序。基本上,这里的目标是按数字排序,而不是按字母排序。我还尝试在 &lt;td&gt; 本身内显示值(例如 10 或 100),但它没有改变任何东西。在这一点上,我什至不确定 DataTables 是如何读取 HTML 标记的。是不是看&lt;span&gt; 的类是sr-only

有人可以提出解决方案吗?

编辑

@Gyrocode.com 创建了一个很棒的 jsfiddle。我添加了更多记录来显示问题:jsfiddle

【问题讨论】:

即使不指定类型也可以工作,请参阅jsfiddle.net/k4aauf0n @Gyrocode.com 它按字母顺序排序。因此,如果您有 0、10、20、50、90、100,它会将它们按降序排列为 90、50、20、100、10、0。我试图获得 100、90、50、20、10 , 0. 尝试jsfiddle.net/k4aauf0n/1/ 并单击Progress &lt;th&gt;。不过,我确实很欣赏小提琴,谢谢! 您的小提琴有错字,它对我有用,无需任何排序插件,请参阅jsfiddle.net/k4aauf0n/2。但是也有num-html,但它在没有插件的情况下也适用于我。 咦,打错字了?什么都看不到 您示例中的进度条之一的值为90,但宽度为10%,这看起来是错误排序操作的结果。这是我在jsfiddle.net/k4aauf0n/2 中出现的列,它从 10,30,90,90 到 100 正确排序,请参阅i.stack.imgur.com/9WsLb.png 【参考方案1】:

使用num-html排序插件。

$.extend($.fn.dataTableExt.oSort, 
    "num-html-pre": function ( a ) 
        var x = String(a).replace( /<[\s\S]*?>/g, "" );
        return parseFloat( x );
    ,

    "num-html-asc": function ( a, b ) 
        return ((a < b) ? -1 : ((a > b) ? 1 : 0));
    ,

    "num-html-desc": function ( a, b ) 
        return ((a < b) ? 1 : ((a > b) ? -1 : 0));
    
 );

$(document).ready(function() 
    var table = $('#example').DataTable(
       columnDefs: [
           targets: 0, type: 'num-html' 
       ]
    );
 );

有关代码和演示,请参阅updated jsFiddle。

【讨论】:

有什么理由让它以前在您的示例中有效,但现在在我的示例中无效? @Alex,还不确定。它具有内置的类型检测机制,但使用num-html 会强制使用特定的排序方法。 再次感谢您,您为此付出了相当多的努力。我已经在我的页面上尝试了 100 多条记录,甚至使用 v.1.10.9(我之前尝试过 v.1.10.13,其中 num-html 现在已弃用)进度条是随机排序的,我可以看不到任何逻辑模式。我想在这一点上,我会更进一步,并在他们的 github 页面和他们的论坛上报告这一点。再次感谢您的意见! @Alex,你一定做错了,因为即使是 1.10.13 也对我有用,请参阅 jsfiddle.net/k4aauf0n/8 经过反复试验,我终于发现 Bootstrap 弹出框弄乱了排序。删除后,排序恢复正常,即使 DataTables 没有任何选项。我猜它修改了 innerHtml 或类似的东西。无论如何,谢谢

以上是关于在 DataTables 中使用 HTML 对数值数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

DataTables.js 对包含带有整数文本的 HTML 链接的列进行排序

DataTables 根据 TD 属性值对 html 表进行排序

SPFx 模态在 datatables.net 中使用常规 html 按钮打开

jquery plugins —— datatables 搜索后汇总

DataTables:按纪元时间排序

在 jQuery DataTables 中使用锚标记对列进行排序