【问题标题】:Can datatables sort a column with an input field?数据表可以对带有输入字段的列进行排序吗?
【发布时间】:2012-07-07 18:06:40
【问题描述】:

我正在尝试让数据表对我的列进行排序。第一列可以正常工作,因为它是一个简单的数字。但是,下一列是输入字段。当我尝试进行那种排序时,什么也没有发生。

<table width="100%" cellspacing="0" class="table sortable no-margin">
<thead>
<tr>
   <th scope="col" class="sorting" style="width: 57px;">
        <span class="column-sort">
        <a href="#" title="Sort up" class="sort-up"></a>
        <a href="#" title="Sort down" class="sort-down"></a>
        </span>
        ID
   </th>
   <th scope="col" class="sorting_desc" style="width: 94px;">
        <span class="column-sort">
        <a href="#" title="Sort up" class="sort-up"></a>
        <a href="#" title="Sort down" class="sort-down"></a>
        </span>
        Order
   </th>
</tr>
</thead>
<tbody>
<tr id="row_20" class="odd">
    <td id="refKey_20" style="text-align:center;" class="">
        1Y
    </td>
    <td class=" sorting_1">
        <input type="text" value="160" size="3" name="item.Order" 
        maxlength="3" id="Order_20" >
    </td>

</tr>
<tr id="row_19" class="even">
    <td id="refKey_19" style="text-align:center;" class="">
        1X
    </td>
    <td class=" sorting_1">
        <input type="text" value="150" size="3" name="item.Order" 
        maxlength="3" id="Order_19" >
    </td>

</tr>
</tbody>
</table>

有什么方法可以让数据表对输入字段进行排序?

【问题讨论】:

    标签: jquery-datatables


    【解决方案1】:

    最简单的方法是在&lt;span style="visibility:hidden"&gt;value of the input&lt;/span&gt;列内添加一个隐藏跨度

    【讨论】:

    • 好招!首先是隐藏跨度,然后是输入。都在列内
    • 非常好!简单易行。就我而言,我只是从 visibility:hidden 更改为 display:none 所以它不占用 DOM 空间。谢谢!
    【解决方案2】:

    你应该看看这个例子,它解释了如何do sorting on input fields. 基本上你声明了一个排序函数

    /* Create an array with the values of all the input boxes in a column */
    $.fn.dataTableExt.afnSortData['dom-text'] = function  ( oSettings, iColumn )
    {
        var aData = [];
        $( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
            aData.push( this.value );
        } );
        return aData;
    }
    

    然后告诉你的桌子使用它

    $('#example').dataTable( {
        "aoColumns": [
            null,
            { "sSortDataType": "dom-text" }
        ]
    } );
    

    或机智 aoColumnDefs

    $('#example').dataTable( {
        "aoColumnDefs": [{ "sSortDataType": "dom-text" , aTarget: "yourclass"}]
    } );
    

    【讨论】:

    • 但是我有一个问题。我对不同的表使用相同的刷新代码。您的代码对 aoColumns 进行了硬编码。是否可以将这些设置为 td 列上的类?或者我可以制作一组不同的“aoColumns”并为每个表使用不同的?
    • @Gemma 我通常不得不为每个表手动设置 aoColumns,我认为您应该有不同的 aoColumns 集,而不是根据需要使用它们,同时保持其他选项固定
    • 你试过aoColumnDefs吗?我只是想了解一下。我认为可以根据一个th的类来设置。
    • @Gemma,从未尝试过,但应该可以,我将其添加到我的答案中
    【解决方案3】:

    对于 Datatables 1.10+ 的版本,一些选项变量的名称已更改,并引入了新的 API。此处的文档:http://datatables.net/examples/plug-ins/dom_sort.html

    这是 1.10+ 中上述已接受答案的工作版本:

    $(document).ready(function () {
        var table = $('#example').DataTable({
            "columnDefs": [
                {
                    "orderDataType": "dom-input",
                    "targets": 0, // Just the first column
                },
            ],
        });
    });
    

    自定义排序功能:

    $.fn.dataTable.ext.order['dom-input'] = function (settings, col) {
        return this.api().column(col, { order: 'index' }).nodes().map(function (td, i) {
            return $('input', td).val();
        });
    }
    

    【讨论】:

    • 您必须将 type: 'string' 添加到 columnDefs 数组对象才能使其在字母数字字段上工作
    【解决方案4】:
    jQuery.fn.dataTableExt.oSort['textbox-asc'] = function (a, b) {
        var vala = $('#' + $(a).filter('input').attr('id')).val().toLowerCase();
        var valb = $('#' + $(b).filter('input').attr('id')).val().toLowerCase();
        if (vala === '')
            return 1;
        if (valb === '')
            return -1;
        return vala < valb ? -1 : vala > valb ? 1 : 0;
    };
    
    jQuery.fn.dataTableExt.oSort['textbox-desc'] = function (a, b) {
        var vala = $('#' + $(a).filter('input').attr('id')).val().toLowerCase();
        var valb = $('#' + $(b).filter('input').attr('id')).val().toLowerCase();
        if (vala === '')
            return 1;
        if (valb === '')
            return -1;
        return vala < valb ? 1 : vala > valb ? -1 : 0;
    };
    

    然后像这样使用它

     $(datatable).dataTable({
                        "iDisplayLength": 50,
                        "bLengthChange": false,
                        "bPaginate": false,                        
                        "columns": [
                            null, { "sType": "textbox" }
                        ],
                    });
    

    【讨论】:

      【解决方案5】:

      如果您决定使用列选项从 JSON 文件中渲染信息,您可以轻松地在渲染属性上添加隐藏跨度。看起来好像 DataTables 查找要排序的文本,如果找不到,它将中断。 https://datatables.net/examples/plug-ins/dom_sort.html 的示例使用了一个已经呈现的表。这是一个使用 API 的示例:

      ...columns([{ 
              "data": "receivedDate",
              "render": function (data, type, row, meta)
              {
      
                  if (data == "null")
                  {
                      return "<input type='text' id='datepicker_" + meta.row + "' class='datepicker form-control' /><span class='hidden'><span>";
                  }
                  else
                  {
                      return "<input type='text' id='datepicker_" + meta.row + "' class='datepicker form-control' value='" + moment(data).format("MM/DD/YYYY") + "'/><span class='hidden'>" + moment(data).format('MM/ DD / YYYY') + "</span>";
                  }
              }
          }]);
      

      【讨论】:

        【解决方案6】:

        用输入字段前的值设置一个不可见的div。

        <tbody>
        <tr id="row_20" class="odd">
            <td id="refKey_20" style="text-align:center;" class="">
                1Y
            </td>
            <td class=" sorting_1">
                <div style="display:none;">160</div>
                <input type="text" value="160" size="3" name="item.Order" 
                maxlength="3" id="Order_20" >
            </td>
        
        </tr>
        <tr id="row_19" class="even">
            <td id="refKey_19" style="text-align:center;" class="">
                1X
            </td>
            <td class=" sorting_1">
                <div style="display:none;">150</div>
                <input type="text" value="150" size="3" name="item.Order" 
                maxlength="3" id="Order_19" >
            </td>
        </tr>
        </tbody>
        

        【讨论】:

        • 这在用户编辑输入值时不起作用,没有代码来更新更改事件的值,这似乎工作太多了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多