【问题标题】:"Normalize" HTML table with rowspan使用行跨度“规范化”HTML 表格
【发布时间】:2012-06-20 08:49:28
【问题描述】:

有没有办法确定或计算 HTML 表格是否以及如何使用行跨度进行规范化?或者如果有一个 JavaScript 库可以做到这一点。

例如,这张表:

+-----------+---------+
| Apple     | Red     |
| Apple     | Green   |
| Apple     | Yellow  |
| Sun       | Yellow  |
| Sun       | Hot     |
| Charizard | Hot     |
| Charizard | Pokémon |
+-----------+---------+

会变成这样:

+-----------+---------+
| Apple     | Red     |
|           | Green   |
|           |---------|
|-----------| Yellow  |
| Sun       |-------- |
|-----------| Hot     |
|           |---------|
| Charizard | Pokémon |
+-----------+---------+

看看这个小提琴,看看我的意思:http://jsfiddle.net/scorch/LZKkQ/

其中一些组合很容易手动计算,但有些可能相当复杂。我想尽可能地最小化表格,并确保没有其他组合可以进一步最小化它。即,最好只有表中的唯一值。

编辑:不要介意小提琴中的额外列。似乎 Firefox 在最右边一列的行跨度方面存在一些问题,所以我不得不添加另一个以达到预期的效果。

编辑 2

下面提到的DataTables 插件fnMultiRowspanfnFakeRowspan 并没有真正得到想要的结果。两个插件都需要事先以正确的方式对表格进行排序才能工作; fnFakeRowspan 仅适用于一列,fnMultiRowspan 给出以下结果(热和黄色在第二列中重复):

+-----------+---------+
|           | Red     |
| Apple     | Green   |
|           | Yellow  |
|-----------+---------|
| Charizard | Hot     |
|           | Pokémon |
|-----------+---------|
| Sun       | Yellow  |
|           | Hot     |
+-----------+---------+

【问题讨论】:

  • 你试过自己写吗?
  • 是的,有一个 jquery 库 Datatable 具有此功能,请参阅:Visually grouping two or more cells in a row with the same content
  • 我试图找到一种数学方法来做到这一点,但我似乎无法找到一种方法来得出一个方程式。
  • 从可访问性的角度来看,您可以并且应该将数据单元格与复杂数据表中的标题单元格相关联,例如带有 col/rowspan 的数据表。它通过 id/headers 以类似于表单中的 for/id 的方式完成。请参阅WCAG 2.0 Technique H43 了解更多信息。这将为算法增加工作量,但因为您已经在循环遍历表......
  • 如果黄色也在喷火龙中呢?那么它会是什么样子呢?

标签: html html-table


【解决方案1】:

正如上面在 cmets 中提到的@MahmoudGamal,有一个名为DataTables 的jQuery 插件可能有用。查看fnFakeRowspan 函数:

当一行中有两个或多个具有相同内容的单元格时,在列中创建行跨单元格,从而有效地将它们在视觉上分组在一起。注意 - 此插件目前仅在服务器端处理时才能正常运行。

根据快速阅读代码,您似乎指定了一个列,然后它会查找重复项,并根据需要组合单元格。 (注意:我自己没有尝试过这段代码。)

【讨论】:

  • 嗯,差不多到一半了。我试过了,它只支持一列,而不是多列。而且表格必须事先以完全正确的顺序排序才能正常工作。论坛上有一些插件的变体,但没有一个能真正发挥作用。无论如何,谢谢,可能会看看它,看看我是否可以通过一些修改让它做我想做的事情。
  • 否,它支持多列。但是您必须再次致电fnFakeRowspan()
【解决方案2】:

如果你对 JavaScript 有足够的了解,自己编写它会很简单。您需要做的就是检查下一个字符串是否与当前字符串相同,然后只增加一个的高度而不是打印两次。

编辑:所以你希望它最终像

+-----------+---------+
| Apple     | Red     |
| Pokémon   | Green   |
| Sun       | Yellow  |
| Charizard | Hot     |
+-----------+---------+

【讨论】:

  • 嗯,也有先排序的。不仅仅是column1 asc, column2 asc,因为这可能不是排列它的最佳方式(如上面的示例表所示),因为第二列也需要行跨度。通过在初始排序后移动行可以做出更优化的排列。
  • 并非如此。检查问题中的“将变成这个:”表。
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2021-02-05
相关资源
最近更新 更多