gpt4 book ai didi

javascript - 如果有内表,则使用纯 JavaScript 进行过滤或搜索

转载 作者:行者123 更新时间:2023-12-03 00:36:49 25 4
gpt4 key购买 nike

我试图使用纯 javascript 制作搜索功能。我有一个小代码片段需要处理。但如果我们在多个 tr 中有内部表,则这不起作用。我们如何才能实现这一目标?

<!DOCTYPE html>
<html>
<head></head>
<body>
<input type="text" size = "4" id="myInput" onkeyup="myFunction()">
<table id="myTable">
<tr>
<td>Alfreds Futterkiste</td>
<td>Germany</td>
</tr>
<tr>
<td>Koniglich Essen</td>
<td>Germany</td>
</tr>
</table>

<script>
function myFunction() {
var input, filter, table, tr, td, i, txtValue;
input = document.getElementById("myInput");
filter = input.value.toUpperCase();
table = document.getElementById("myTable");
tr = table.getElementsByTagName("tr");

for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td")[0];

if (td) {
txtValue = td.textContent || td.innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
</script>
</body>
</html>

如果我的 HTML 如下所示,为什么此脚本功能不起作用

<table id="myTable">
<tr>
<td>Alfreds Futterkiste</td>
<td>Germany</td>
</tr>
<tr>
<td>Koniglich Essen</td>
<td>Germany</td>
</tr>
<tr>
<td>
<table>
<tr>
<td>USA</td>
</tr>
<tr>
<td>UK</td>
</tr>
</table>
</td>
</tr>
</table>

最佳答案

您可以检查每个 td 的内容,看看它是否包含一个表,然后递归地检查该表,看看是否应该显示其内容。我已经用您的一些代码完成了此操作,但我会进一步分解这些功能。

此代码返回一个 bool 表示形式,表示内表是否完全隐藏,或不用作隐藏包含内表的行的逻辑的一部分。如果内表已隐藏,但行中的另一个元素未隐藏,则内表行将再次显示。

function myFunction() {
const input = document.getElementById("myInput"),
filter = input.value.toUpperCase(),
table = document.getElementById("myTable");

filterTableRows(table, filter)

}

function filterTableRows(table, filter) {
const rows = table.getElementsByTagName('tr');
let hiddenRows = 0;

for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {

let show = false;
const columns = rows[rowIndex].getElementsByTagName('td');

for (let columnIndex = 0; columnIndex < columns.length; columnIndex++) {

const innerTables = columns[columnIndex].getElementsByTagName('table');

if (innerTables.length) {
for (let tableIndex = 0; tableIndex < innerTables.length; tableIndex++) {
if ( ! filterTableRows(innerTables[tableIndex], filter)) {
show = true;
}
}
} else {
let txtValue = columns[columnIndex].textContent || columns[columnIndex].innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
show = true;
}

}
}

if (show) {
rows[rowIndex].style.display = "";
for (let columnIndex = 0; columnIndex < columns.length; columnIndex++) {
const innerTables = columns[columnIndex].getElementsByTagName('table');
if (innerTables.length) {
for (let tableIndex = 0; tableIndex < innerTables.length; tableIndex++) {
showTable(innerTables[tableIndex]);
}
}
}
} else {
rows[rowIndex].style.display = "none";
hiddenRows++;
}

}


return hiddenRows == rows.length;
}

function showTable(table) {
const rows = table.getElementsByTagName('tr');
for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
rows[rowIndex].style.display = "";
}
}
<!DOCTYPE html>
<html>

<head></head>

<body>
<input type="text" size="4" id="myInput" onkeyup="myFunction()">
<table id="myTable">
<tr>
<td>Alfreds Futterkiste</td>
<td>Germany</td>
</tr>
<tr>
<td>Koniglich Essen</td>
<td>Germany</td>
</tr>
<tr>
<td>
<table>
<tr>
<td>Pierre Truffant</td>
</tr>
</table>
</td>
<td>France</td>
</tr>
</table>
</body>

</html>

关于javascript - 如果有内表,则使用纯 JavaScript 进行过滤或搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53624402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com