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

如何用Axios和原生JS将列车数据分行输出到HTML表格对应行

问题原因

你的代码存在4个直接导致显示异常的问题:

  • 你持续向页面初始写死的3个固定单元格(.trainNum/.trainDep/.trainArr)追加文本,HTML默认会折叠换行符\n,不会自动把文本拆分成多行,所以所有内容都堆在同一个单元格里,改display: flex自然不会生效。
  • 循环内创建表格行、单元格的逻辑完全错误:你先用createElement创建了td元素,转头又用字符串覆盖了这些DOM变量,还把单元格插入行的代码注释掉了,最终只把空行加到了表格里,没有实际填充内容。
  • 没有做旧数据清空逻辑,每次点击搜索都会把新内容叠加到老内容上,多次搜索会出现大量重复数据。
  • 不符合HTML表格规范:把动态数据行放在了<thead>表头标签内部,表头只应该放列标题,动态数据需要放在<tbody>标签内。
修正方案

1. 调整HTML结构

删掉原本写在thead里的空数据行,新增专门放动态结果的tbody标签:

<section class="trainSchedule">
  <strong><p class="train-title">Railway Time Table</p></strong>
  <div class="box">
    Does the train go to Stockholm?
    <br />
    I'm departing from..

    <input type="text" class="request-input" placeholder="Ex: Göteborg" />
    <button class="request-btn">Search...</button>
    <div class="message-box">
      <table class="table">
        <thead>
          <tr>
            <th class="trainNumber">TrainNr:</th>
            <th class="departure">Departure:</th>
            <th class="arrival">Arrival:</th>
          </tr>
        </thead>
        <tbody class="train-tbody"></tbody>
      </table>
    </div>
    Departing from: <strong><div class="response-result"></div></strong>
  </div>
</section>

2. 重写JS渲染逻辑

核心逻辑改为:每次查询前清空旧结果,每一趟列车单独创建一行,三个字段分别生成独立单元格插入对应行,再把行添加到tbody中:

let reqBtn = document.querySelector(".request-btn");
let reqInput = document.querySelector(".request-input");
let respResult = document.querySelector(".response-result");
let trainTbody = document.querySelector(".train-tbody");

const API_KEY = "xxxxxxxxxxxxxxx";
const DEST_ID_FIXED = "740000001";

function getOriginIdURL(city, key) {
  return `https://api.resrobot.se/v2.1/location.name?input=${city}&format=json&accessId=${key}`;
}

function getRouteURL(originId, destId, key) {
  return `https://api.resrobot.se/v2.1/trip?format=json&originId=${originId}&destId=${destId}&passlist=true&showPassingPoints=true&accessId=${key}`;
}

function findRoute(fromCity) {
  let searchURL = getOriginIdURL(fromCity, API_KEY);

  axios.get(searchURL).then((response) => {
    let data = response.data;
    let originId = data.stopLocationOrCoordLocation[0].StopLocation.extId;

    let routeURL = getRouteURL(originId, DEST_ID_FIXED, API_KEY);

    axios.get(routeURL).then((response) => {
      let data = response.data;
      // 清空上一次查询的旧数据
      trainTbody.innerHTML = '';

      for (let i = 0; i < 3; i++) {
        // 为每趟车创建独立行
        const tr = document.createElement('tr');
        
        // 车次单元格
        const numTd = document.createElement('td');
        numTd.textContent = data.Trip[i].LegList.Leg[0].Product[0].name;
        // 发车时间单元格
        const depTd = document.createElement('td');
        depTd.textContent = data.Trip[i].Origin.time;
        // 到达时间单元格
        const arrTd = document.createElement('td');
        arrTd.textContent = data.Trip[i].Destination.time;

        // 单元格插入行,行插入表格
        tr.append(numTd, depTd, arrTd);
        trainTbody.append(tr);
      }

      respResult.textContent = reqInput.value;
    });
  });
}

reqBtn.addEventListener("click", () => {
  const keyword = reqInput.value.trim();
  if (!keyword) return;
  findRoute(keyword);
});

3. 可选:添加基础CSS优化对齐

不需要flex布局,用表格自带的布局能力就能实现整齐对齐:

.table {
  border-collapse: collapse;
  width: 100%;
}
.table th, .table td {
  text-align: left;
  padding: 8px 16px;
  border-bottom: 1px solid #e5e5e5;
}

修改后每趟列车信息会单独占一行,三个字段分别对应到所属列的单元格,完全匹配你预期的展示效果,不会再出现内容堆叠问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:12:27