我正在尝试以智能的方式过滤表格行(而不是只有大量的代码才能最终完成工作),而是一种相当干燥的灵感。
我的表中有5列。在每个顶部都有一个下拉列表或一个文本框,用户可以使用该文本框过滤表数据(基本上隐藏不适用的行)
jQuery有很多表过滤插件,但没有一个像这样工作,这就是复杂的部分:|
答案 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";
}
}
}
}