【问题标题】:Can't filter datatable by selected value in dropdown无法按下拉列表中的选定值过滤数据表
【发布时间】:2012-11-01 14:18:23
【问题描述】:

我正在使用 jQuery 插件 DataTables。我有一个包含 HTML 输入和选择的数据表。当我使用 DataTable 搜索过滤器过滤结果并搜索具有选定值“打开”的所有下拉列表时,没有任何变化。

我相信这种情况正在发生,因为表格中的每个下拉菜单都有相同的选项,并且过滤器正在搜索它们并返回所有结果,因为它们都匹配。

如何让过滤器只搜索选定的值而不是下拉列表的所有选项?

我试图找到解决方案,但我只能找到如下结果:

这些都涉及为每列添加自定义过滤器,我只想使用现有的 DataTable 过滤器。

示例

Live example of the problem,搜索“打开”或“关闭”

代码

<table>
        <thead>
            <tr>
                <th>Name</th>
                <th>Status</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><input name="name" type="text" value="Need more memory" id="name1"></td>
                <td><select name="status" id="status1">
                        <option value="2">Closed</option>
                        <option selected="selected" value="1">Open</option>
                    </select>
                </td>
            </tr>
            <tr>
                <td><input name="name" type="text" value="Can't connect" id="name2"></td>
                <td><select name="status" id="status2">
                        <option selected="selected" value="2">Closed</option>
                        <option value="1">Open</option>
                    </select>
                </td>
            </tr>
        </tbody>
</table>

【问题讨论】:

  • 有什么方法可以使用 JSON 而不是将 HTML 渲染到数据表中?使用 JSON 数据,这将很容易 :)
  • @loncar 可能,这将如何改变我的排序?无论数据来自哪里,排序不都是一样的吗?
  • 如果数据是 JSON 格式,您可以使用高级选项,例如 mDatamRendersType

标签: javascript html datatables


【解决方案1】:

现在,您可以将&lt;td&gt;-element 上的data-search 属性与数据表一起使用。 ref

<tr>
    <td>
       <input name="name" type="text" value="Need more memory" id="name1">
     </td>
     <td data-search="Open">
        <select name="status" id="status1">
          <option value="2">Closed</option>
          <option selected="selected" value="1">Open</option>
        </select>
     </td>
    </tr>
<tr>

fiddle

my similar question on datatables.net

【讨论】:

    【解决方案2】:

    有一种更好的方法可以将下拉列表放入单元格中。当然,这是可以搜索的。您可以观看offical tutorial 了解此技术。

    客户端

    创建下拉列表

    当你初始化插件时,你可以这样做:

    <script type="text/javascript">
       $(document).ready(function () {
          $('#datatable').dataTable().makeEditable({
             sUpdateURL: "UpdateData.php",//Server side file accepting AJAX call.
             "aoColumns": [//Column settings.
             {},//1st column with default settings.
             {//2nd column to a drop-down list.
                indicator: 'Saving...',
                loadtext: 'Loading...',
                type: 'select',//This will make it a drop-down list.
                onblur: 'submit',
                data: "{'open':'Open','closed':'Closed'}"
             }]
          });
       });
    </script>
    

    关键是数据部分。您可以在此处定义列表的选项。你也可以通过 PHP 动态地添加这部分。一个选项的语法如下。

    'variable_sent_to_UpdateData.php':'Text that will be displayed'
    

    每个选项都应该用逗号分隔。

    列名

    您还可以重命名列,如 offical tutorial 所示,这样当它们传递到服务器时,DataTables 不会在 &lt;th&gt; 标记之后命名它们:

    <script type="text/javascript">
       $(document).ready(function () {
          $('#datatable').dataTable(
             aoColumns: [//Rename columns contained by AJAX call.
                {sName: "name"},
                {sName: "status"}
             ]
          ).makeEditable({
             //Previous stuff...
          });
       });
    </script>
    

    服务器端

    毕竟,你只需要更新UpdateData.php中的数据库:

    $id = $_REQUEST['id'];//The id tag of your table's row.
    $column = $_REQUEST['columnName'];//Column where the cell was edited.
    $value = $_REQUEST['value'];//The new value.
    $columnPosition = $_REQUEST['columnPosition'];
    $columnId = $_REQUEST['columnId'];
    $rowId = $_REQUEST['rowId'];
    
    switch ($column)
    {
       case 'name':
          //Do SQL update...
          echo $value;
          break;
       case 'status':
          //Do SQL update...
          echo $value;
          break;
       default: echo 'Error';
    }
    

    echo(返回)$value 变量很重要,因为:

    • 表示更新成功。
    • 此值将是表中的新值。
    • 如果您返回其他内容,它将被视为错误消息,将显示在弹出窗口中,并且不会在表格中显示任何更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-06
      • 2014-07-26
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2020-03-24
      相关资源
      最近更新 更多