【问题标题】:How can I post-process my html to collapse large tables?如何对我的 html 进行后处理以折叠大表格?
【发布时间】:2023-03-31 23:52:01
【问题描述】:

我的网页上有一个占位符,其中填充了文件之间匹配/不匹配的 html 表格。问题是页面中有很多数据需要滚动浏览,我想让每个表格都可以折叠。

也许在 html 表格上进行后期处理以折叠标题下的所有行,并且如果用户愿意,只需一个“+”按钮或其他东西来显示行。

如果可能,我想避免添加非原生 css 依赖项。

<br>
<label style="font-weight:bold;color:#c9d3e0"> Header1 </label>
<table>
   <tbody>
      <tr class="Header Row">
          <td> (bunch of td cells for length of columns) </td>
      </tr>
      <tr class="Matched Row">
          <td> (bunch of td cells for length of columns) </td>
      </tr>
      <tr class="Mismatched Row">
          <td> (bunch of td cells for length of columns) </td>
      </tr>
   < /tbody>
</table>
<br>

(repeat for dynamic N tables)

【问题讨论】:

  • 您可以使用 CSS 可见性功能吗?如果是这样,只需将带有 javascript 的类添加到您要隐藏的区域,css 将隐藏该类
  • 也许我几天前回答的这个问题对你有一些帮助:stackoverflow.com/questions/50473899/… 你的数据会像你的例子那样排序,还是在不匹配的地方有一些匹配,反之亦然反之亦然?
  • 我认为这篇文章的发展方向是我需要我的cs在制作表格时动态添加一些文字。如果它是正确的 html 格式,有人可以告诉我这个带有正确 html 的表格会是什么样子吗?例如,它将是: Header1 +(那个加号是一个按钮)(默认情况下没有下面的东西,直到点击那个 '+') Header 2 + 等等。我已经准备好启动依赖项了。我认为可见性可折叠是可能的,但我不知道上表的外观,因为我是格式化 html 的新手。

标签: javascript html css asp.net


【解决方案1】:

我已经调整并尝试增强我对其他问题 (Need of Recursive html table tree using only Javascript) 的回答,使其适用于您的数据示例:

function nextTr(row) {
  while ((row = row.nextSibling) && row.nodeType != 1);
  return row;
}

document.getElementById("myTable").addEventListener("click", function(e) {
  if (!e) return;
  if (e.target.tagName !== "A") return;
  e.preventDefault();
  
  var row = e.target.closest("tr");
  var cls = row.classList[0];
  var lvl = +(cls.slice(-1)) + 1;
  cls = cls.slice(0, -1) + lvl;

  while ((row = nextTr(row)) && (row.className.includes(cls) || row.className.includes("open")))
    row.classList.toggle("open");
    
});

// Select all the tr childs elements (all levels except 0)
var allChilds = document.querySelectorAll("tr:not([class*=level0])");
document.getElementById("openAll").addEventListener("click", function() {
  allChilds.forEach(function(elm){
    elm.classList.add("open");
  });
});
document.getElementById("closeAll").addEventListener("click", function() {
  allChilds.forEach(function(elm){
    elm.classList.remove("open");
  });
});
tbody tr {
  display: none;
}

th, td {
  padding: 4px 12px;
}

tr:first-of-type,
tr[class*="level0"],
tr.open {
  display: table-row;
}

tr[class*="level0"] th { background: #ccc; }
tr[class*="level1"] td { background: #ddd; }
tr[class*="level2"] td { background: #eee; }
<button id="openAll">+ All</button>
<button id="closeAll">- All</button>
<br>
<label style="font-weight:bold;color:#c9d3e0"> Header1 </label>
<table id="myTable">
  <tbody>
    <tr class="level0">
      <th><a>+/-</a></th><th>Header 1</th>
    </tr>
    <tr class="level1">
      <td></td><td>Match 1</td>
    </tr>
    <tr class="level1">
      <td></td><td>Match 2</td>
    </tr>
    <tr class="level0">
      <th><a>+/-</a></th><th>Header 2</th>
    </tr>
    <tr class="level1">
      <td></td><td>Match 1</td>
    </tr>
    <tr class="level1">
      <td><a>+/-</a></td><td>Match 2</td>
    </tr>
    <tr class="level2">
      <td></td><td>Match 2.1</td>
    </tr>
    <tr class="level0">
      <th><a>+/-</a></th><th>Header 3</th>
    </tr>
    <tr class="level1">
      <td></td><td>Match 1</td>
    </tr>
    <tr class="level1">
      <td></td><td>Match 2</td>
    </tr>
  </tbody>
</table>
<br>

使用此代码,您可以有多个级别。

如有任何意见,请随时发表评论。
我希望它对您有所帮助。

【讨论】:

  • 谢谢,先看看这个,了解如何在我自己的代码中实现它。如果你有第二个,你能否通过展示如果它只对每个标题都可折叠,这将是什么来帮助你的解释?例如。每个标题只有一个 +/-。 Header1 +/-(默认隐藏 tr's)然后 Header2 +/-、Header3 +/- 等,因为我正在生成一些未知的长度,这将有助于我连接点。
  • @MarkMcGown 我更新了我的答案。 level0 元素现在是 th 元素。
猜你喜欢
  • 2014-07-11
  • 2020-06-12
  • 2013-06-05
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 2016-12-26
  • 2021-10-11
  • 2013-08-31
相关资源
最近更新 更多