代码之家  ›  专栏  ›  技术社区  ›  DeepSpace

datatables.search函数修改后的奇怪行为

  •  0
  • DeepSpace  · 技术社区  · 6 年前

    这个问题是 this question .

    我创造了 this JSFiddle 用于演示目的。

    请注意,在第1列中搜索值时,搜索按预期工作。但是,在第2列中搜索值时(使用相同的“搜索字段”), data_table.search 似乎根本没有调用,找不到相关行(按F12在控制台中查看调试信息)。

    var data_table = $("#table").DataTable();
    var search_term = null;
    $.fn.DataTable.ext.search.push(
      function(settings, row, index) {
        if (search_term) {
          search_term = search_term.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
          search_term = search_term.toLowerCase();
        }
    
        console.log(`search_term is ${search_term}`)
    
    
        var approver = $(data_table.cell(`:eq(${index})`, ':eq(0)').node()).find('.approver-select').val().toLowerCase();
        console.log(`approver is ${approver}`)
    
        var approver_match = approver.match(search_term);
        console.log(`approver_match is ${approver_match}`)
    
        var network_or_group = $(data_table.cell(`:eq(${index})`, ':eq(1)').node()).find('.network-or-group-text').val().toLowerCase();
        console.log(`network_or_group is ${network_or_group}`)
    
        var network_or_group_match = network_or_group.match(search_term);
        console.log(`network_or_group_match is ${network_or_group_match}`)
    
        console.log(`approver_match || network_or_group_match || !search_term is ${approver_match || network_or_group_match || !search_term}`)
    
        console.log('')
        console.log('')
    
        return approver_match || network_or_group_match || !search_term;
      }
    );
    
    $('#table_filter input', data_table.table().container()).on('keyup.DT cut.DT paste.DT input.DT search.DT', event => {
      search_term = $(event.target).val();
      data_table.draw();
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <html>
    
    <body>
      <table id="table">
        <thead>
          <th>column1</th>
          <th>column2</th>
        </thead>
        <tbody>
          <tr>
            <td>
              <select class="approver-select">
                <option selected>user1</option>
                <option>user2</option>
              </select>
            </td>
            <td>
              <input class="network-or-group-text" type="text" value="1.1.1.1/32">
            </td>
          </tr>
          <tr>
            <td>
              <select class="approver-select">
                <option>user1</option>
                <option selected>user2</option>
              </select>
            </td>
            <td>
              <input class="network-or-group-text" type="text" value="2.2.2.0/24">
            </td>
          </tr>
        </tbody>
      </table>
    </body>
    <script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
    
    </html>
    0 回复  |  直到 6 年前
        1
  •  1
  •   Alexandre Elshobokshy    6 年前

    使用 html-input 类型如下。定义目标列并在搜索时返回值。它对选择和输入都有效。

    你不需要检查 keyup.DT cut.DT paste.DT input.DT search.DT 因为datatables也会自动为您这样做。

    $.fn.dataTableExt.ofnSearch['html-input'] = function(value) {
      return $(value).val();
    };
    
    var data_table = $("#table").DataTable({
      columnDefs: [{
        "type": "html-input",
        "targets": [0, 1]
      }]
    });
    <html>
    
    <body>
      <table id="table">
        <thead>
          <th>column1</th>
          <th>column2</th>
        </thead>
        <tbody>
          <tr>
            <td>
              <select class="approver-select">
                <option selected>user1</option>
                <option>user2</option>
              </select>
            </td>
            <td>
              <input class="network-or-group-text" type="text" value="1.1.1.1/32">
            </td>
          </tr>
          <tr>
            <td>
              <select class="approver-select">
                <option>user1</option>
                <option selected>user2</option>
              </select>
            </td>
            <td>
              <input class="network-or-group-text" type="text" value="2.2.2.0/24">
            </td>
          </tr>
        </tbody>
      </table>
    </body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
    <script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
    
    </html>

    这是更干净的,使用datatables的基本类型属性,而不是像现在这样在搜索时过滤所有数据。