如何清除动态生成的 table 中的行?

How do I clear the rows in dynamically generated table?

我有一个 table,它是通过从存储在 localStorage 中的数组获取内容而动态生成的。

不幸的是,我注意到每次脚本 运行 时,它都会附加到 DOM 中现有的 table,如下图所示:

第一次脚本 运行s,下面是生成的内容:

第二次相同的脚本是 运行,生成的内容如下:

在下面找到生成上面 table 的脚本:

var array = JSON.parse(localStorage.getItem('transactionData'));
var table = document.getElementById("table");

for (var i = 0; i < array.length; i++) {
    var newRow = table.insertRow(table.length);             
    currentTransaction = array[i];

    for (var b = 0; b < keys.length; b++) {
        var cell = newRow.insertCell(b);
        cell.innerText = currentTransaction[keys[b]];

        if (keys[b] == "statusIcon") {
           console.log("keys[b] value is: " +currentTransaction[keys[b]] );
           cell.innerHTML = currentTransaction[keys[b]];
            } 
       else {
           cell.innerText = currentTransaction[keys[b]];
            }
     }
}   

这是我的 HTML 代码 table:

<table class="table table-striped" id="table">
  <thead>
    <tr>
      <th>Status</th>
      <th>Amount</th>
      <th>Time</th>
    </tr>
  </thead>
  <tbody>
    <tr>
    </tr>
  </tbody>
</table> 

为了解决这个问题,我正在尝试编写一个脚本来清除 DOM BEFORE 运行ning 中现有呈现的 table table 生成脚本。

在我的脚本下方查找以清除行:

var array = JSON.parse(localStorage.getItem('transactionData'));
var table = document.getElementById("table");
var rowCount = array.length;;

for (var i = rowCount; i > 0; i--) {
    table.deleteRow(i);

}

在脚本 运行 之前,table 看起来像这样:

在这个脚本之后 运行 我看到了这个:

...我还收到以下错误消息:

Uncaught DOMException: Failed to execute 'deleteRow' on 'HTMLTableElement':
The index provided (5) is greater than the number of 
rows in the table (5).

有人可以指出我的脚本有什么问题吗?我该如何解决这个问题?

我认为你应该重构你的代码。使用下面的代码片段,您可以在需要时添加代码,也可以在需要时清除 table。如果您想删除单行,那么我建议给它们一个 ID(在 localStorage 中)并在 table 行上使用它。

//var array = JSON.parse(localStorage.getItem('transactionData'));

// mocking localStorage items
const array = [{
    status: 10,
    amount: 20,
    time: 30
  },
  {
    status: 20,
    amount: 30,
    time: 40
  },
  {
    status: 30,
    amount: 40,
    time: 50
  },
  {
    status: 40,
    amount: 50,
    time: 60
  },
  {
    status: 50,
    amount: 60,
    time: 70
  }
]

var tbody = document.querySelectorAll(".table tbody")[0];

// creating the table
function addTableRows(arr, container) {
  let html = ''
  arr.forEach(e => html += `<tr>${createTableRow(e)}</tr>`)
  return html
}

// creating a single row (tr) of the table
function createTableRow(obj) {
  return `<td>${obj.status}</td><td>${obj.amount}</td><td>${obj.time}</td>`
}

// initializing table
tbody.innerHTML = addTableRows(array, tbody)

// removing rows
document.getElementById('removeRows').addEventListener('click', function(e) {
  tbody.innerHTML = ''
})

// adding rows
document.getElementById('addRows').addEventListener('click', function(e) {
  tbody.innerHTML = addTableRows(array, tbody)
})
<table class="table table-striped" id="table">
  <thead>
    <tr>
      <th>Status</th>
      <th>Amount</th>
      <th>Time</th>
    </tr>
  </thead>
  <tbody>

  </tbody>
</table>

<button id="addRows">Add rows</button></br>
<button id="removeRows">Remove rows</button>

清空 table 的正文 <tbody>,排除 table <thead>。 我给 table 正文 <tbody> 一个 id="tableBodyContent".

查看下面更新的 HTML 代码:

<table class="table table-striped" id="table">
  <thead>
    <tr>
      <th>Status</th>
      <th>Amount</th>
      <th>Time</th>
    </tr>
  </thead>
  <tbody id="tableBodyContent">
    <tr>
    </tr>
  </tbody>
</table>

在动态 table 脚本的开头,我 运行 一个脚本读取 table 主体的值:<tbody id="tableBodyContent">,将其无效,然后用默认值重置它。

查看下面更新的脚本:

var bodyContent = document.getElementById("tableBodyContent");
console.log("Check this out: " +bodyContent.innerHTML);
bodyContent.innerHTML = "";
bodyContent.innerHTML = "<tr> </tr>";


var array = JSON.parse(localStorage.getItem('transactionData'));
var table = document.getElementById("table");

for (var i = 0; i < array.length; i++) {
var newRow = table.insertRow(table.length);             
currentTransaction = array[i];

for (var b = 0; b < keys.length; b++) {
    var cell = newRow.insertCell(b);
    cell.innerText = currentTransaction[keys[b]];

    if (keys[b] == "statusIcon") {
       console.log("keys[b] value is: " +currentTransaction[keys[b]] );
       cell.innerHTML = currentTransaction[keys[b]];
        } 
   else {
       cell.innerText = currentTransaction[keys[b]];
        }
 }
}  

上面的脚本console.logs:

Check this out: <tr> </tr><tr><td><i class="fas fa-check-circle colorBlue">
</i></td><td>10</td><td>10:37am, Sun</td></tr><tr><td><i class="fas fa-
exclamation-triangle colorRed"></i></td><td>50000</td><td>10:36am, Sun</td>
</tr><tr><td><i class="fas fa-exclamation-triangle colorYellow"></i></td>
<td>50000</td><td>10:35am, Sun</td></tr><tr><td><i class="fas fa-exclamation-
triangle colorYellow"></i></td><td>60000</td><td>10:33am, Sun</td></tr><tr>
<td><i class="fas fa-exclamation-triangle colorRed"></i></td><td>50</td>
<td>10:25am, Sun</td></tr><tr><td><i class="fas fa-exclamation-triangle 
colorRed"></i></td><td>6332</td><td>10:24am, Sun</td></tr>