【发布时间】:2019-12-16 05:01:18
【问题描述】:
我有一个包含 2 列和动态行数的 html 表。 和一个下拉过滤器。过滤器工作正常,但过滤后,表格失去了分页。
<div id="bagStatusTable" class="table table-hover" style="margin-top: 5px; margin-left: 10px; display: block; width: 100%;">
<table id="bag_table_id" style="margin-top:10px">
<thead>...</thead>
<colgroup>...</colgroup>
<tbody>
<tr style="display: table-row;">
<td class="bag number" style="font-size:20px; text-align: center; margin-top: 5px">1</td>
<td id="bag_0_status" class="bag status">
<i class="fas fa-running fa-2x" style="color: #FFFF00; -webkit-text-stroke-width: 1px; -webkit-text-stroke-color: #fa9e00;"></i>
</td>
</tr>
<tr style="display: table-row;">
<td class="bag number" style="font-size:20px; text-align: center; margin-top: 5px">2</td>
<td id="bag_1_status" class="bag status">
<i class="fas fa-running fa-2x" style="color: #FFFF00; -webkit-text-stroke-width: 1px; -webkit-text-stroke-color: #fa9e00;"></i>
</td>
</tr>
<tr style="display: table-row;">...</tr>
<tr style="display: table-row;">...</tr>
<tr style="display: table-row;">...</tr>
<tr style="display: table-row;">...</tr>
<tr style>...</tr>
<tr style>...</tr>
<tr style>...</tr>
<tr style>...</tr>
<tr style>...</tr>
<tr style>...</tr>
</tbody>
<tfoot>...</tfoot>
</table>
</div>
过滤器
$("#bagStatusFilter").on("change", function() {
var value = $(this).val().toLowerCase();
if(value == 'all'){
$('.bagStatusFilter').val('');
$('#bag_table_id tr').show();
}
else{
$('#bag_table_id tr').hide();
$("#bag_table_id tr").filter(function() {
($(this).toggle($(this).find("td:nth-child(2)").children().length > 0 && $(this).find("td:nth-child(2)").children()[0].className.includes(value)))
});
}
})
分页
function addPagerToTables(tables, rowsPerPage) {
tables =
typeof tables == "string"
? document.querySelectorAll(tables)
: tables;
for (let table of tables)
addPagerToTable(table, rowsPerPage);
}
function addPagerToTable(table, rowsPerPage) {
let tBodyRows = table.querySelectorAll('tBody tr');
let numPages = Math.ceil(tBodyRows.length/rowsPerPage);
let colCount =
[].slice.call(
table.querySelector('tr').cells
)
.reduce((a,b) => a + parseInt(b.colSpan), 0);
table
.createTFoot()
.insertRow()
.innerHTML = `<td colspan=${colCount}><div class="nav"></div></td>`;
if(numPages == 1)
return;
table.querySelector('.nav')
.insertAdjacentHTML(
'beforeend',
`<a class="page-link" href="#">«</a> `
);
for(i = 0;i < numPages;i++) {
let pageNum = i + 1;
table.querySelector('.nav')
.insertAdjacentHTML(
'beforeend',
`<a class="page-link" href="#" rel="${i}">${pageNum}</a> `
);
}
table.querySelector('.nav')
.insertAdjacentHTML(
'beforeend',
`<a class="page-link" href="#">»</a> `
);
changeToPage(table, 1, rowsPerPage, numPages);
for (let navA of table.querySelectorAll('.nav a'))
navA.addEventListener(
'click',
e => changeToPage(
table,
e.target.innerHTML,
rowsPerPage,
numPages
)
);
}
function changeToPage(table, page, rowsPerPage, totalPages) {
if(isNaN(parseInt(page))){
page = page === "<<" ? 1 : totalPages
}
let startItem = (page - 1) * rowsPerPage;
let endItem = startItem + rowsPerPage;
let navAs = table.querySelectorAll('.nav a');
let tBodyRows = table.querySelectorAll('tBody tr');
for (let nix = 0; nix < navAs.length; nix++) {
if (nix == page - 1)
navAs[nix].classList.add('active');
else
navAs[nix].classList.remove('active');
for (let trix = 0; trix < tBodyRows.length; trix++)
tBodyRows[trix].style.display =
(trix >= startItem && trix < endItem)
? 'table-row'
: 'none';
}
}
我知道这是因为分页功能将表格视为一个整体,而不仅仅是过滤后的行。 我试图在过滤器函数中返回过滤后的行并让分页函数使用它。 但它不起作用。
如何将过滤后的行返回到数组并使用它?
【问题讨论】:
-
你用什么来分页?我看不出你在问题中的哪个地方这么说。
-
我已经添加了分页码
标签: javascript jquery html