【问题标题】:Dynamic & Complex rowspan in HTML tableHTML 表格中的动态和复杂行跨度
【发布时间】:2016-11-14 18:57:56
【问题描述】:

Link to JSFiddle

这是我的 JSON 格式

{
    "result": {
        "buildname1": [{
            "table1": ["xxx","yyy"]
        }, {
            "table2": ["xxx","yyy"]
        }, {
            "table3": ["xxx","yyy"]
        }],
        "buildname2": [{
            "table1": ["xxx","yyy"]
        }, {
            "table2": ["xxx","yyy"]
        }, {
            "table3": ["xxx","yyy"]
        }]
    },
    "Build sets": "yyy",
    "destinationPath": "xxx",
    "status": 1
}

这是我用来动态创建表格的函数。

function generateTable(data){ //data is the parsed JSON Object from an ajax request
    $("#test-table tbody").empty();//Empty the table first
    if(data.result != null){
        $.each(data.result,function(key,value){
            var buildName ="<tr><td rowspan='"+value.length+"'>"+key+"<span class='cyan darken-1 white-text badge'>"+value.length+" base tables</span></td>";
            var baseTable ="";
            for(i=0;i<value.length;i++){
                if( i == 0 ){
                    for(var k in value[0]){
                        baseTable ="<td rowspan='"+value[0][k].length+"'>"+k+"</td></tr>";
                    }
                }
                else{
                    for(var key in value[i]){
                        baseTable = baseTable + "<tr><td rowspan='"+value[i][key].length+"'>"+key+"</td></tr>";
                    }
                }
            }
            $("#test-table").append(buildName + baseTable);
        });
    }
}

这是我想要达到的目标

HTML

<table id="test-table" class="bordered responsive-table">
  <thead>
    <tr>
      <th>Build Name</th><th>Base Table</th><th>Query List</th>
    </tr>
  </thead>
</table>

问题:

我成功地创建了前两列(虽然有些难看,我想我以后可以改进它),我被困在第三列。我发布的代码正确地创建了前两列,但行跨度(第三列)中的行跨度的逻辑似乎让我无法理解。请指导我。

【问题讨论】:

  • 您对此有疑问吗?如果有,请详细说明问题。目前这里没有问题
  • @RoryMcCrossan 对不起。我过早地发布了问题而没有先正确检查
  • 拥有您的 html 也很有用,即使我们在这种情况下可以猜到,请养成在您的问题或 codepen/jsfiddle 中发布它的习惯
  • @RobinDardelet jsfiddle.net/80ek406h
  • @MageshKumaar 我想我知道如何实现您的目标。查看我的答案并告诉我。谢谢!

标签: javascript jquery html


【解决方案1】:

老实说,我以前从未使用过rowspan,但在阅读了this stack answer 之后,我对它的理解要好得多——我强烈建议你也这样做。之后,只需弄清楚元素从 JSON 到 DOM 的顺序即可。

这是一个工作演示:

var data = '{"result":{"buildname1":[{"table1":["xxx","yyy", "zzz"]},{"table2":["xxx","yyy"]}],"buildname2":[{"table1":["xxx","yyy", "zzz"]},{"table2":["xxx","yyy"]},{"table3":["xxx","yyy"]}], "buildname3":[{"table1":[]},{"table2":["xxx","yyy"]},{"table3":[]}], "buildname4":[]},"Build sets":"yyy","destinationPath":"xxx","status":1}';

function generateTable(data) { //data is the parsed JSON Object from an ajax request
  data = JSON.parse(data);
  $("#test-table tbody").empty(); //Empty the table first
  Object.entries(data.result).forEach(([key, elem]) => {
    var baseHtml = "";
    var childrenHtml = "";
    var maxRowSpan = 0;
    elem.forEach((inner_elem, index) => {
      var [innerElemKey, arr] = Object.entries(inner_elem)[0];
      var elemRowSpan = Math.max(arr.length, 1);
      maxRowSpan += elemRowSpan;

      if (index !== 0) {
        childrenHtml += "<tr>";
      } 
      childrenHtml += ('<td rowspan="' + elemRowSpan + '">' + innerElemKey + '</td>');
      
      arr.forEach((child, indx) => {
        if (indx !== 0) {
          childrenHtml += "</tr>";
        }
        childrenHtml += ('<td rowspan="1">' + child + '</td>' + '</tr>');
      });
    });
    baseHtml += ('<tr><td rowspan="' + Math.max(maxRowSpan, 1) + '">' + key + '</td>');
    $("#test-table").append(baseHtml + childrenHtml);
  });
}

$(function() {
  generateTable(data);
});
td {
  border: 1px solid black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="test-table" class="bordered responsive-table">
  <thead>
    <tr>
      <th>Build Name</th>
      <th>Base Table</th>
      <th>Query List</th>
    </tr>
  </thead>
</table>

#静态 HTML

<table id="test-table" class="bordered responsive-table">
  <thead>
    <tr>
      <th>Build Name</th><th>Base Table</th><th>Query List</th>
    </tr>
  </thead>
</table>

#生成的 HTML

<table id="test-table" class="bordered responsive-table">
  <thead>
    <tr>
      <th>Build Name</th>
      <th>Base Table</th>
      <th>Query List</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="5">buildname1</td>
      <td rowspan="3">table1</td>
      <td rowspan="1">xxx</td>
    </tr>
    <tr>
      <td rowspan="1">yyy</td>
    </tr>
    <tr>
      <td rowspan="1">zzz</td>
    </tr>
    <tr>
      <td rowspan="2">table2</td>
      <td rowspan="1">xxx</td>
    </tr>
    <tr>
      <td rowspan="1">yyy</td>
    </tr>
    <tr>
      <td rowspan="7">buildname2</td>
      <td rowspan="3">table1</td>
      <td rowspan="1">xxx</td>
    </tr>
    <tr>
      <td rowspan="1">yyy</td>
    </tr>
    <tr>
      <td rowspan="1">zzz</td>
    </tr>
    <tr>
      <td rowspan="2">table2</td>
      <td rowspan="1">xxx</td>
    </tr>
    <tr>
      <td rowspan="1">yyy</td>
    </tr>
    <tr>
      <td rowspan="2">table3</td>
      <td rowspan="1">xxx</td>
    </tr>
    <tr>
      <td rowspan="1">yyy</td>
    </tr>
  </tbody>
</table>

【讨论】:

  • 非常感谢:)。您发布的那个链接对于帮助我理解这个解决方案非常有用。
  • jsfiddle.net/6xytngz7 请看看这个小提琴。如果我想避免像 xxx,xxxunique 这样的重复条目,但还要保持像 &lt;td data-count='2'&gt;xxx&lt;/td&gt; 这样的计数,该怎么办?
  • 如果我们在任何孩子中有一个空数组,即在这种情况下说"table1": [] 表结构中断。关于如何解决这个问题的任何想法?
  • @HenonoaH 更新为处理 "table1": []"buildname1": [] 的空数组。本质上的问题是,如果数组为空,它给出的 rowspan 值为 0,它将它视为可以达到的最大值。我解决这个问题的方法是强制最小行跨度为 1。此外,我对代码进行了相当多的清理以提高可读性/可维护性。
猜你喜欢
  • 2020-10-08
  • 2014-07-27
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2021-06-05
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多