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

使用innerHTML动态替换HTML未达预期效果的技术求助

运动记录更新后渲染异常(容器嵌套)问题修复

问题描述

实现了_renderWorkoutUpdated函数,接收更新值对象来替换特定运动记录,但更新后的第一条记录出现容器嵌套问题,样式与其他记录不一致。

问题根源

你当前的代码是给已存在的<li class="workout">元素设置innerHTML,但拼接的HTML字符串开头又包含完整的<li>标签、结尾包含</li>标签,最终DOM结构变成了嵌套的<li>:

<li class="workout">
  <li class="workout workout--type" data-id="xxx">
    <!-- 内容 -->
  </li>
</li>

嵌套结构破坏了原有布局规则,导致样式异常。

修复方案

移除HTML字符串开头的<li>标签和结尾的</li>标签,只保留<li>内部的内容即可:

修复后的代码

_renderWorkoutUpdated(currentWorkout) {
    let html = `
    <div class="container">
        <div class="workout__title">
        ${currentWorkout.description}
        </div>
      <div class="dropdown">
        <div class="kebab-menu">
            <div class="bar"></div>
            <div class="bar"></div>
            <div class="bar"></div>        
        </div>
        <div class="dropdown-content" id="dropdownContent-${currentWorkout.id}">
        <div class="option">Edit</div>
        <div class="option">Delete</div>
        <div class="option">Delete All</div>
        </div>
      </div>
    </div>       
    
    <div class="workout__details">
      <span class="workout__icon">${
        currentWorkout.type === 'running' ? '🏃🏻' : '🚴🏻'
      }</span>
      <span class="workout__value">${currentWorkout.distance}</span>
      <span class="workout__unit">km</span>
    </div>
    <div class="workout__details">
      <span class="workout__icon">⏱</span>
      <span class="workout__value">${currentWorkout.duration}</span>
      <span class="workout__unit">min</span>
    </div>`;

    if (currentWorkout.type === 'running')
      html += `
    <div class="workout__details">
      <span class="workout__icon">⚡️</span>
      <span class="workout__value">${currentWorkout.pace.toFixed(1)}</span>
      <span class="workout__unit">min/km</span>
    </div>
    <div class="workout__details">
      <span class="workout__icon">🦶🏼</span>
      <span class="workout__value">${currentWorkout.cadence}</span>
      <span class="workout__unit">spm</span>
    </div>`;

    if (currentWorkout.type === 'cycling')
      html += `
    <div class="workout__details">
    <span class="workout__icon">⚡️</span>
    <span class="workout__value">${currentWorkout.speed.toFixed(1)}</span>
    <span class="workout__unit">km/h</span>
  </div>
  <div class="workout__details">
    <span class="workout__icon">⛰</span>
    <span class="workout__value">${currentWorkout.elevationGain}</span>
    <span class="workout__unit">m</span>
  </div>`;

    document.querySelector(
      `.workout[data-id="${currentWorkout.id}"]`
    ).innerHTML = html;
  }

额外优化提示

  • 原代码中id="dropdownContent"会在多个运动记录中重复,已改为id="dropdownContent-${currentWorkout.id}"生成唯一ID,避免JS或样式冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:18:09