You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript将API返回数据加载到表格的不同行(仅单个<td>)

解决表格数据全部挤入同一行的问题

这个问题的核心是你错误地把表格行(<tr>)嵌套到了表格单元格(<td>)里面,这完全不符合HTML表格的结构规范,浏览器为了修复无效结构,就把所有数据都挤到了原来的那个单元格里,导致所有内容显示在同一行。咱们来一步步修复:

1. 修正HTML结构

首先把<tbody>里多余的初始行去掉,让它保持空状态,这样后续动态生成的行可以直接作为它的子元素:

<table class="table table-striped table-bordered" id="editable-datatable">
  <thead>
    <tr>
      <th class="footable-sortable"> Host <span class="footable-sort-indicator"></span> </th>
    </tr>
  </thead>
  <tbody class="text-center" id="concat_here">
    <!-- 这里留空,等待JS动态插入行 -->
  </tbody>
</table>

2. 修改JS代码(两种可选方式)

方式一:使用DOM创建元素(更规范,避免XSS风险)

直接获取<tbody>元素,循环数据时创建新的<tr>和<td>,然后把它们添加到<tbody>中:

if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  const obj = JSON.parse(xmlhttp.responseText);
  const tbody = document.getElementById('concat_here');
  
  // 先清空tbody,防止重复加载数据时出现重复内容
  tbody.innerHTML = '';
  
  obj.log_ast.forEach(item => {
    const tr = document.createElement('tr');
    const td = document.createElement('td');
    td.textContent = item.address;
    
    tr.appendChild(td);
    tbody.appendChild(tr);
  });
}

方式二:使用innerHTML拼接(更简洁,适合数据安全的场景)

如果能确保item.address的内容是安全的(没有恶意脚本),可以用字符串拼接的方式一次性生成所有行的HTML,再赋值给<tbody>的innerHTML:

if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  const obj = JSON.parse(xmlhttp.responseText);
  const tbody = document.getElementById('concat_here');
  let rowsHtml = '';
  
  obj.log_ast.forEach(item => {
    rowsHtml += `<tr><td>${item.address}</td></tr>`;
  });
  
  // 一次性替换tbody内容,比循环添加更高效
  tbody.innerHTML = rowsHtml;
}

为什么原来的代码会出错?

你之前的代码是把<tr>插入到<td id="row1">的内部,这违反了HTML的结构规则(<tr>只能是<table>、<thead>、<tbody>或<tfoot>的子元素)。浏览器遇到这种无效结构时,会自动调整DOM树,最终所有的<tr>都会被当成无效内容,被塞进原来的那个单元格里,所以所有数据都显示在了同一行。

内容的提问来源于stack exchange,提问作者rojoka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:46:43