jQuery表行按列过滤

时间:2010-08-11 15:05:32

标签: javascript jquery filtering

我正在尝试以智能的方式过滤表格行(而不是只有大量的代码才能最终完成工作),而是一种相当干燥的灵感。

我的表中有5列。在每个顶部都有一个下拉列表或一个文本框,用户可以使用该文本框过滤表数据(基本上隐藏不适用的行)

jQuery有很多表过滤插件,但没有一个像这样工作,这就是复杂的部分:|

4 个答案:

答案 0 :(得分:10)

以下是基本过滤示例http://jsfiddle.net/urf6P/3/

它使用jquery选择器:contains('some text')和:not(:contains('some text'))来决定是否应显示或隐藏每一行。这可能会让你朝着一个方向前进。

已编辑以包含来自jsfiddle的HTML和javascript:

$(function() {    
    $('#filter1').change(function() { 
        $("#table td.col1:contains('" + $(this).val() + "')").parent().show();
        $("#table td.col1:not(:contains('" + $(this).val() + "'))").parent().hide();
    });

});

答案 1 :(得分:1)

这可能不是最好的方法,而且我不确定性能,但是一个选项是标记每列(在每一行中)的id以列标识符开头,然后是唯一的数字就像一个记录标识符。

例如,如果您有一个列Produce Name,并且记录ID是763,我会执行以下操作:

​​<table id="table1">
    <thead>
        <tr>
            <th>Artist</th>
            <th>Album</th>
            <th>Genre</th>
            <th>Price</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td id="artist-127">Red Hot Chili Peppers</td>
            <td id="album-195">Californication</td>
            <td id="genre-1">Rock</td>
            <td id="price-195">$8.99</td>
        </tr>
        <tr>
            <td id="artist-59">Santana</td>
            <td id="album-198">Santana Live</td>
            <td id="genre-1">Rock</td>
            <td id="price-198">$8.99</td>
        </tr>
        <tr>
            <td id="artist-120">Pink Floyd</td>
            <td id="album-183">Dark Side Of The Moon</td>
            <td id="genre-1">Rock</td>
            <td id="price-183">$8.99</td>
        </tr>
    </tbody>
</table>

然后,您可以使用jQuery根据id的开头进行过滤。

例如,如果您想按艺术家列进行过滤:

var regex = /Hot/;
$('#table1').find('tbody').find('[id^=artist]').each(function() {
    if (!regex.test(this.innerHTML)) {
        this.parentNode.style.backgroundColor = '#ff0000';
    }
});

答案 2 :(得分:1)

Jeff Treuting 发布的accepted solution略有增强,可以扩展过滤功能以使其不区分大小写。我不相信原始解决方案甚至增强功能。 a solution posted on a different SO post提供的Highway of Life引发了增强的想法。

在这里:

// Define a custom selector icontains instead of overriding the existing expression contains
// A global js asset file will be a good place to put this code
$.expr[':'].icontains = function(a, i, m) {
  return $(a).text().toUpperCase()
      .indexOf(m[3].toUpperCase()) >= 0;
};

// Now perform the filtering as suggested by @jeff
$(function() {    
    $('#filter1').on('keyup', function() {  // changed 'change' event to 'keyup'. Add a delay if you prefer
        $("#table td.col1:icontains('" + $(this).val() + "')").parent().show();  // Use our new selector icontains
        $("#table td.col1:not(:icontains('" + $(this).val() + "'))").parent().hide();  // Use our new selector icontains
    });

});

答案 3 :(得分:0)

步骤:1 在.html文件中写下以下内容

<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names..">

<table id="myTable">
  <tr class="header">
    <th style="width:60%;">Name</th>
    <th style="width:40%;">Country</th>
  </tr>
  <tr>
    <td>Alfreds Futterkiste</td>
    <td>Germany</td>
  </tr>
  <tr>
    <td>Berglunds snabbkop</td>
    <td>Sweden</td>
  </tr>
  <tr>
    <td>Island Trading</td>
    <td>UK</td>
  </tr>
  <tr>
    <td>Koniglich Essen</td>
    <td>Germany</td>
  </tr>
</table>

步骤:2 在.js文件中写下以下内容

function myFunction() {
  // Declare variables 
  var input, filter, table, tr, td, i;
  input = document.getElementById("myInput");
  filter = input.value.toUpperCase();
  table = document.getElementById("myTable");
  tr = table.getElementsByTagName("tr");

  // Loop through all table rows, and hide those who don't match the search query
  for (i = 0; i < tr.length; i++) {
    td = tr[i].getElementsByTagName("td")[0];
    if (td) {
      if (td.innerHTML.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      } else {
        tr[i].style.display = "none";
      }
    } 
  }
}