【问题标题】:Filter table from <select> input using jQuery使用 jQuery 从 <select> 输入中过滤表
【发布时间】:2016-09-30 05:08:51
【问题描述】:

我正在尝试使用 jQuery 从按字母顺序排列的 &lt;select&gt; 输入中过滤表格。

我在表格的两列中有名字和姓氏,我想按其中任何一个来过滤行。

我有一个选择输入设置如下:

<select>
    <option value="A">A</option>
    <option value="B">B</option>
    <option value="C">C</option>
    ...
</select>

我想过滤这个表:

<tr>
    <td>Joe</td>
    <td>Schmoe</td>
    <td>$2482.79</td>
    <td>172.78.200.124</td>
    <td>http://gmail.com</td>
</tr>
<tr>
    <td>John</td>
    <td>Doe</td>
    <td>$2776.09</td>
    <td>119.232.182.142</td>
    <td>http://www.example.com</td>
</tr>

如何使用 jQuery 过滤表格?

【问题讨论】:

    标签: jquery select html-table


    【解决方案1】:

    假设您只有一个选择和一个结构类似于您的示例的表格,这将起作用

    $(document).ready(function($) {
        var rows = $('table tr').each(function() {
            var row = $(this);
            var columns = row.children('td');
    
            row.data('name-chars', [
                columns.eq(0).html()[0].toUpperCase(),
                columns.eq(1).html()[0].toUpperCase(),
            ]);
        });
    
        $('select').change(function() {
            var char = $(this).val().toUpperCase();
    
            rows.each(function() {
                var row = $(this);
                var chars_to_match = row.data('name-chars');
                if($.inArray(char, chars_to_match) > -1) {
                    row.show();
                }
                else {
                    row.hide();
                }
            });
        });
    });
    

    【讨论】:

    • 太棒了!现在我怎么能包含 &lt;option&gt; 来显示所有行?
    • 将第一个选项添加为“全部”,如果值为“全部”,则在更改函数中执行 $('table tr').show() 即可。
    • 为什么要为每一行使用“数据”方法存储前两个字符?如果要遍历所有行,不妨按需获取前两个字符。
    • 很棒的功能,我的脚本用这个!
    【解决方案2】:

    我想出了这个。与 Elzo 提出的非常相似,但将其限制在表格的前两列。

     $('select').change( function(e) { 
       var letter = $(this).val();
         if (letter === 'ALL') {
             $ ('tr').show ();
         }
         else {
             $('tr').each( function(rowIdx,tr) {
                 $(this).hide().find('td').each( function(idx, td) {
                     if( idx === 0 || idx === 1) {
                         var check = $(this).text();
                         if (check && check.indexOf(letter) == 0) {
                             $(tr).show();
                         }
                     }
                 });             
    
             });
         }             
     });
    

    它不会忽略大小写,并假设您有一个选择并且页面上唯一的 tr 是您要过滤的那些。

    编辑添加了“全部”选项以再次显示行。

    【讨论】:

      【解决方案3】:

      如果您的表格的 id 是 sel,并且表格是 tab,那么这将起到作用。更改 eq(0) 以更改要查看的列。选择框中的空值将重新显示所有 trs。

      var selSelection = $("#sel").val();
      if(!selSelection) $("#tab tr").show();
      else $("#tab tr").show().filter(function(index){
          return $("td:eq(0)", this).html().indexOf(selSelection) == -1;
      }).hide();
      

      【讨论】:

        【解决方案4】:

        $("td:not(:contains('" + input_value + "'))").remove();

        这是区分大小写的...您要过滤的具体内容是什么?

        【讨论】:

          【解决方案5】:

          试试这个。如有必要,将 y 替换为 $(y)。

          $('tr').hide();
          $('select').change( function(){
              var letter = $(this).val();
              var dataset = $('#tableID').find('td');
              $.each(dataset, function(x, y){
                  if( y.substr(0,1) == letter){
                      y.parent().show();
                  }
              });
          });
          

          编辑

          @SolutionYogi。你说的对。我猜这行可以改写为:

          var dataset = $('#tableID').find('tr').children('td').slice(0,1);
          

          但从未尝试过。

          编辑 2

          我对此进行了测试。我希望也足够优雅,并且我没有更多错误。

          $('tr').hide();
          $('select').change( function(){
              var letter = $(this).val();
              var dataset = $('#tableID').find('tr');
                  $.each(dataset, function(x, y){
                      var data = $(y).children().slice(0,2);
                          $.each(data, function(a, b){
                              if( $(b).html().substr(0,2) == letter){
                                  $(b).parent().show();
                              }
                       });
                 });
          });
          

          【讨论】:

          • 您的代码搜索所有列,而作者只想搜索前两列。
          • 该代码不会只搜索第一行的前两个单元格吗?
          • 你又是对的。我会尝试找到另一种解决方案,这样您就不会解析整个 td 集。
          • 作者想搜索前两个字母,因为你只匹配一个字符。
          • 我修改为 substr(0,2)。这段代码更像是一个解决问题的概念,然后是为人们编写代码。人们必须能够更改、理解和调整我们在这里展示的代码,否则结果将是徒劳的。是吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          • 2023-01-13
          • 2014-01-16
          • 2020-03-23
          • 2015-05-07
          • 2013-10-25
          相关资源
          最近更新 更多