如何使用 JavaScript show/hide 隐藏 HTML table 行(无 jQuery)
How to show/hide hidden HTML table rows using JavaScript (no jQuery)
编辑:下面已经回答了这个问题。
我想要一个 HTML table,它在每行之间隐藏了一些行,其中包含有关顶级行的更多信息。单击第一列中的 expand/collapse 图像 link 时,隐藏行的可见性将从 display:none 切换;到 display:table-行;。我有一段时间没有写 JavaScript 并且需要能够在 JavaScript 中严格执行此操作并且不能使用 jQuery toggle() 方法。
如何使用 JavaScript 找到按钮所在的带有 class="parentRow" 的带有 class="subRow" 的同级在 table 中,然后切换该同级行的可见性?
HTML
<table style="width:50%">
<caption>Test Table</caption>
<thead>
<tr align="center">
<th><span class="offscreen">State Icon</span></th>
<th>Column 2</th>
<th>Column 3</th>
<th>Column 4</th>
<th>Column 5</th>
</tr>
</thead>
<tbody>
<tr align="center" class="parentRow">
<td><a href="#" onclick="toggleRow();"><img alt="Expand row" height="20px;" src="expand.png"></a></td>
<td>test cell</td>
<td>test cell</td>
<td>test cell</td>
<td>test cell</td>
</tr>
<tr style="display: none;" class="subRow">
<td colspan="5"><p>Lorem ipsum dolor sit amet...</p></td>
</tr>
....
</tbody>
</table>
CSS
.offscreen {
position: absolute;
left: -1000px;
top: 0px;
overflow:hidden;
width:0;
}
.subRow {
background-color: #CFCFCF;
}
JavaScript
function toggleRow() {
var rows = document.getElementsByClassName("parentRow").nextSibling;
rows.style.display = rows.style.display == "none" ? "table-row" : "none";
}
使用 id 属性而不是 class 来获取元素,并在其 id 中为任何行赋予一个唯一的数字以使其不同。
<tr style="display: none;" class="subRow" id="subRow1">
.
.
.
<tr style="display: none;" class="subRow" id="subRow2">
.
.
<tr style="display: none;" class="subRow" id="subRow3">
使用 this
:
向您的事件处理程序传递对单击的行的引用
<td><a href="#" onclick="toggleRow(this);"><img alt="Expand row" height="20px;" src="expand.png"></a></td>
然后按如下方式更新您的 toggleRow 函数:
function toggleRow(e){
var subRow = e.parentNode.parentNode.nextElementSibling;
subRow.style.display = subRow.style.display === 'none' ? 'table-row' : 'none';
}
您可能需要考虑创建一个通用函数来向上导航 DOM 树(这样该函数就不会破坏 when/if 您更改您的 HTML)。
这对我有用:
function toggleRow() {
var row = document.getElementsByClassName("parentRow")[0];
var next = row.parentNode.rows[ row.rowIndex ];
next.style.display = next.style.display == "none" ? "table-row" : "none";
}
编辑:下面已经回答了这个问题。
我想要一个 HTML table,它在每行之间隐藏了一些行,其中包含有关顶级行的更多信息。单击第一列中的 expand/collapse 图像 link 时,隐藏行的可见性将从 display:none 切换;到 display:table-行;。我有一段时间没有写 JavaScript 并且需要能够在 JavaScript 中严格执行此操作并且不能使用 jQuery toggle() 方法。
如何使用 JavaScript 找到按钮所在的带有 class="parentRow" 的带有 class="subRow" 的同级在 table 中,然后切换该同级行的可见性?
HTML
<table style="width:50%">
<caption>Test Table</caption>
<thead>
<tr align="center">
<th><span class="offscreen">State Icon</span></th>
<th>Column 2</th>
<th>Column 3</th>
<th>Column 4</th>
<th>Column 5</th>
</tr>
</thead>
<tbody>
<tr align="center" class="parentRow">
<td><a href="#" onclick="toggleRow();"><img alt="Expand row" height="20px;" src="expand.png"></a></td>
<td>test cell</td>
<td>test cell</td>
<td>test cell</td>
<td>test cell</td>
</tr>
<tr style="display: none;" class="subRow">
<td colspan="5"><p>Lorem ipsum dolor sit amet...</p></td>
</tr>
....
</tbody>
</table>
CSS
.offscreen {
position: absolute;
left: -1000px;
top: 0px;
overflow:hidden;
width:0;
}
.subRow {
background-color: #CFCFCF;
}
JavaScript
function toggleRow() {
var rows = document.getElementsByClassName("parentRow").nextSibling;
rows.style.display = rows.style.display == "none" ? "table-row" : "none";
}
使用 id 属性而不是 class 来获取元素,并在其 id 中为任何行赋予一个唯一的数字以使其不同。
<tr style="display: none;" class="subRow" id="subRow1">
.
.
.
<tr style="display: none;" class="subRow" id="subRow2">
.
.
<tr style="display: none;" class="subRow" id="subRow3">
使用 this
:
<td><a href="#" onclick="toggleRow(this);"><img alt="Expand row" height="20px;" src="expand.png"></a></td>
然后按如下方式更新您的 toggleRow 函数:
function toggleRow(e){
var subRow = e.parentNode.parentNode.nextElementSibling;
subRow.style.display = subRow.style.display === 'none' ? 'table-row' : 'none';
}
您可能需要考虑创建一个通用函数来向上导航 DOM 树(这样该函数就不会破坏 when/if 您更改您的 HTML)。
这对我有用:
function toggleRow() {
var row = document.getElementsByClassName("parentRow")[0];
var next = row.parentNode.rows[ row.rowIndex ];
next.style.display = next.style.display == "none" ? "table-row" : "none";
}