【问题标题】:jQuery tablesorter is not sorting number correctlyjQuery tablesorter 没有正确排序数字
【发布时间】:2017-09-18 23:39:53
【问题描述】:

我几天来一直在尝试让 jQuery tablesorter 正确地对我的表格列中的数字进行排序。

我正在使用这两个脚本的当前最新版本。

表格呈现正常,但数字排序不正确。

当我对数字列进行排序时,它会给我以下结果:

8 7 4 32 31 3 等等。

您期望的位置: 32 31 8 等等……

我阅读了一些关于添加额外 javascript 代码的 cmets,但我找不到任何好的 javascript 示例。

我现在使用的jQuery如下:

$(document).ready(function()
    {
      $("#table1")
       .tablesorter(
          {
            sortList: [[0,0]],
            widthFixed: true,
            widgets: ['zebra']
          } )
    }
);

这是我的 HTML:

<table id="table1" class=tablesorter>
    <thead>
        <tr>
            <th width=65>Name</th>
            <th width=40>Count</th>
        </tr>
     </thead>
     <tbody>
         <tr><td>Name_1</td><td>32</td></tr>
         <tr><td>Name_2</td><td>12</td></tr>
         <tr><td>Name_3</td><td>11</td></tr>
         <tr><td>name_4</td><td>14</td></tr>
         <tr><td>Name_5</td><td>7</td></tr>
         <tr><td>Name_6</td><td>3</td></tr>
         <tr><td>Name_7</td><td>32</td></tr>
         <tr><td>Name_8</td><td>31</td></tr>
         <tr><td>Name_9</td><td>35</td></tr>
      </tbody>
</table>

【问题讨论】:

  • 您对“java”的引用应更改为“JavaScript”。

标签: jquery tablesorter


【解决方案1】:

如果有人发现这篇文章,希望这会对他们有所帮助,您现在可以在 tablesorter 中简单地使用。

$(".table").tablesorter({
     headers: {
         5: { sorter: 'digit' } // column number, type
     }
 });

【讨论】:

  • 您缺少“headers”数组的结尾大括号...让我来解决这个问题:)
  • 多年后看到此内容的人请注意,列从 0 开始。
【解决方案2】:
<th width=110 class=\"{sorter: 'digit'}\">Count</th>

这解决了问题。 告诉 javascript 将值作为数字处理使排序工作正确。 仍然有点傻,在脚本中没有将数字值检查为数字。但我想这最终会有更高的目的。

感谢大家的时间和帮助

/字体

【讨论】:

  • 您在课堂上转义了双引号的任何原因?我正在解决类似的问题。
  • th 标签内的 class="{sorter: 'digit'}" 对我来说效果很好。
  • 请注意,任何尝试此操作的人 - 您还需要在页面中包含 jquery.metadata.js 文件以引用此类内联属性。
【解决方案3】:

这对其他人(对我而言不是)可能很明显,但要使解决方案与 {sorter: 'digit'} 元数据一起使用,您需要使用 jQuery metadata plugin

【讨论】:

【解决方案4】:

你也可以试试这个:

$(document).ready(function() { 
    $("table").tablesorter({ 
        // put other options here ...
        textExtraction: function(node) {  
            return parseInt($(node).text()); 
        } 
    }); 
});

...这会将已排序单元格的内容视为整数,仅提取文本后。

【讨论】:

    【解决方案5】:

    我知道这是一个老问题,但我遇到了同样的问题,而不是尝试此处发布的任何解决方案,您应该首先检查插件的版本。当我发现我没有使用最新版本(2.0.5)时,所有问题都解决了

    【讨论】:

      【解决方案6】:

      看来您需要填写数字。这就解释了为什么 8、7 和 4 排在 32 和 31 之前。

      试试这个:

      function padLeft(s,len,c){
        c=c || '0';
        while(s.length< len) s= c+s;
        return s;
      }
      
      $("table").tablesorter({
        textExtraction: function(node) {         
          return padLeft(node.innerHTML,2);
        } 
      });
      

      如果您需要对更大的数字进行排序,请使用大于 2 的值。

      【讨论】:

        【解决方案7】:

        你也可以显示你的 html 吗? Tablesorter 应该在没有任何特殊选项的情况下检测和处理数字排序。您的数值是否可能被html包围?在这种情况下,您可能需要 custom method to extract 来自 html 的值。

        来自引用链接的示例:

        $(document).ready(function() { 
        
            // call the tablesorter plugin 
            $("table").tablesorter({ 
                // define a custom text extraction function 
                textExtraction: function(node) { 
                    // extract data from markup and return it  
                    return node.childNodes[0].childNodes[0].innerHTML; 
                } 
            }); 
        });
        

        【讨论】:

          【解决方案8】:

          在 jquery.tablesorter.js 代码中查找:

          this.isDigit = function(s,config) {
          
              var DECIMAL = '\\' + config.decimal;
              var exp = '/(^[+]?0(' + DECIMAL +'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)' + DECIMAL +'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*' + DECIMAL +'0+$)/';
          
              return RegExp(exp).test($.trim(s));
          };
          

          并将其替换为:

          this.isDigit = function(s,config) {
          
              var DECIMAL = '\\' + config.decimal;
              var exp = '/(^[+]?0(' + DECIMAL +'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)' + DECIMAL +'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*' + DECIMAL +'0+$)/';
          
              //return RegExp(exp).test($.trim(s));
              return !isNaN(parseFloat($.trim(s))) && isFinite($.trim(s));
          };
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-04
            • 2012-12-23
            相关资源
            最近更新 更多