【问题标题】:Merge rows with same value of first column only in html table仅在html表中合并具有相同第一列值的行
【发布时间】:2020-10-03 19:54:40
【问题描述】:

我有一个动态 html 表,如果值相同,我希望仅将第一列中的行合并在一起。Image of table。第一列的前两行值相同,应该合并,但第三列的行值不应该合并。

<table id="example1" class="table table-bordered">
  <thead>
    <th class="hidden"></th>
    <th>Area</th>
    <th>Name</th>
    <th>Party</th>
    <th>Symbol</th>
    <th>Total Number of Votes</th>
  </thead>
  <tbody>
    <?php
                    $query="SELECT * FROM `candidates` ";
                    $result=mysqli_query($con,$query);
                    
                    while($row = mysqli_fetch_array($result)){
                      $sql1 = "SELECT `Name`,`Symbol` FROM `party` WHERE `Party_ID` = '".$row["Party_ID"]."' " ;
                      $query1 = $con->query($sql1);
                      $row1 = $query1->fetch_assoc();
                      $sql2 = "SELECT `Name` FROM `part` WHERE `Part_No` = '".$row["Part_No"]."' " ;
                      $query2 = $con->query($sql2);
                      $row2 = $query2->fetch_assoc();
                      $time1 = filemtime("../party/".$row['Symbol']);
                      echo "
                        <tr>
                          <td class='hidden'></td>
                          <td>".$row2['Name']."</td>
                          <td>".$row['Name']."</td>
                          <td>".$row1['Name']."</td>
                          <td><img src='../party/".$row1['Symbol']."?".$time1."' alt='".$row1['Symbol']."' role='button' width='30px' height='30px' onclick='window.open(this.src)'></td>
                          <td>".$row['Total_Votes']."</td>
                        </tr>
                      ";
                    }
                  ?>
  </tbody>
</table>

【问题讨论】:

  • 你的问题,至少对我来说,没有任何意义。请显示合并前两行后表格的外观。大概你也会合并第一列的第 3 行和第 4 行
  • 您应该考虑使用rowspan 您的图像暗示该表是可排序的,这表明您必须在每次对表进行排序时重新检查。
  • 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your dataEscaping is not enough!
  • @DCR 是的,你是对的,我想组合第一列的行,对于提供的图像,它将是第一和第二行组合,第三和第四行组合。但是第三列的值也相同,但不需要将它们组合起来。仅适用于第一列。
  • @ATD 是的,我的表已排序,即对于第一列,相同的值将始终是连续的。但我不能使用静态行跨度,因为我不知道有多少连续行将具有相同的值。

标签: javascript html datatable


【解决方案1】:

好的,以这个为例:

function mergeCells() {
  let db = document.getElementById("databody");
  let dbRows = db.rows;
  let lastValue = "";
  let lastCounter = 1;
  let lastRow = 0;
  for (let i = 0; i < dbRows.length; i++) {
    let thisValue = dbRows[i].cells[0].innerHTML;
    if (thisValue == lastValue) {
      lastCounter++;
      dbRows[lastRow].cells[0].rowSpan = lastCounter;
      dbRows[i].cells[0].style.display = "none";
    } else {
      dbRows[i].cells[0].style.display = "table-cell";
      lastValue = thisValue;
      lastCounter = 1;
      lastRow = i;
    }
  }
}

window.onload = mergeCells;
table {border-collapse: collapse;}
td {border:1px solid black; vertical-align: top;}
<table id="datatable">
  <tbody id="databody">
    <tr><td>1</td><td>Text item 1</td></tr>
    <tr><td>1</td><td>Text item 10</td></tr>
    <tr><td>2</td><td>Text item 3</td></tr>
    <tr><td>2</td><td>Text item 9</td></tr>
    <tr><td>3</td><td>Text item 7</td></tr>
    <tr><td>4</td><td>Text item 6</td></tr>
    <tr><td>5</td><td>Text item 2</td></tr>
    <tr><td>5</td><td>Text item 4</td></tr>
    <tr><td>5</td><td>Text item 5</td></tr>
    <tr><td>5</td><td>Text item 8</td></tr>
  </tbody>
</table>

我刚刚添加了足够的内容来展示该功能如何工作。

【讨论】:

  • 它在 js 的第 2 行显示“Cannot read property 'rows' of null”。
  • 我已将 id="databody" 添加到 标记中。但是我有自己的 标签 id,我用它来使用 bower 组件使其成为数据表,这就是为什么我没有更改它,而且我没有看到
    id 被使​​用的任何相关性脚本。
  • 问题已解决,必须在
  • 元素之后调用该函数。由于我的表是动态的,因此在加载表之前执行 onload 事件中的函数。谢谢你的帮助。
  • np - 对于我所做的大部分事情,我倾向于使用 tbody 标签上的 ID。但是,我也在 table 标签上留下了一个 ID,以防你使用它。只要你能找到 TR 标签,那就一切都好。
猜你喜欢
相关资源
最近更新 更多
热门标签