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

如何使用VanillaJS实现点击按钮新增div卡片并保留历史数据

解决方法:保留旧数据,追加新学员卡片

你遇到的核心问题是替换了容器内容而非追加——原来的代码用innerHTML =直接覆盖了#mentees里的所有内容,所以每次添加新学员时旧的卡片就没了。用Vanilla JS完全可以实现保留旧数据的需求,下面给你两种可行方案:

方案1:用innerHTML +=快速实现追加

这种方式简单直接,只需要修改addMentee函数,把赋值操作改成累加,同时把每个学员的信息包裹在独立的卡片div中:

function newMentee() {
  document.getElementById('new-mentee-form').style.display="block";
  document.getElementById('mentees').style.display="block"; // 保持列表可见,不用隐藏
}

function addMentee() {
  document.getElementById('new-mentee-form').style.display="none";
  
  // 获取用户输入的信息
  const name = document.getElementById('name').value.trim();
  const rating = document.getElementById('rating').value.trim();
  const comments = document.getElementById('comments').value.trim();
  
  // 跳过空输入(可选,避免创建空卡片)
  if (!name) return;
  
  // 构建单个学员的卡片HTML结构
  const menteeCard = `
    <div class="mentee-card">
      <strong>Name: ${name}</strong><br><br>
      Rating: ${rating}<br><br>
      Comments: ${comments}
    </div>
  `;
  
  // 追加到容器中,而非替换原有内容
  document.getElementById('mentees').innerHTML += menteeCard;
  
  // 清空表单,方便下次输入
  document.getElementById('name').value = '';
  document.getElementById('rating').value = '';
  document.getElementById('comments').value = '';
}

然后在CSS里添加卡片的样式(把原来写在JS里的样式移到CSS,更符合规范):

#mentees {
  margin-top: 3em;
  overflow: hidden; /* 清除浮动,防止容器高度塌陷 */
}

.mentee-card {
  background-color: black;
  width: 10em;
  min-height: 10em; /* 用min-height适配内容高度 */
  margin: 0 2em 2em 2em;
  padding: 2em;
  border-radius: 2em;
  word-wrap: break-word;
  color: white;
  float: left; /* 让卡片横向排列,可选 */
}

方案2:更安全的DOM元素创建方式(推荐)

如果担心用户输入包含特殊字符(比如<、&)导致格式问题或XSS风险,推荐用原生DOM API创建元素,这种方式更安全可靠:

function addMentee() {
  document.getElementById('new-mentee-form').style.display="none";
  
  const name = document.getElementById('name').value.trim();
  const rating = document.getElementById('rating').value.trim();
  const comments = document.getElementById('comments').value.trim();
  
  if (!name) return;
  
  // 创建卡片容器
  const card = document.createElement('div');
  card.classList.add('mentee-card');
  
  // 创建并添加各个内容节点
  const nameEl = document.createElement('strong');
  nameEl.textContent = `Name: ${name}`;
  
  const ratingEl = document.createElement('p');
  ratingEl.textContent = `Rating: ${rating}`;
  
  const commentsEl = document.createElement('p');
  commentsEl.textContent = `Comments: ${comments}`;
  
  // 组装卡片内容
  card.appendChild(nameEl);
  card.appendChild(document.createElement('br'));
  card.appendChild(document.createElement('br'));
  card.appendChild(ratingEl);
  card.appendChild(document.createElement('br'));
  card.appendChild(document.createElement('br'));
  card.appendChild(commentsEl);
  
  // 把卡片追加到学员列表
  document.getElementById('mentees').appendChild(card);
  
  // 清空表单
  document.getElementById('name').value = '';
  document.getElementById('rating').value = '';
  document.getElementById('comments').value = '';
}

CSS部分和方案1一样,不需要修改。

关键原理说明

原来的innerHTML =是覆盖式赋值,会删除容器内所有现有DOM节点,替换成新的HTML字符串。而innerHTML +=相当于innerHTML = 原有内容 + 新内容,实现了追加;appendChild则是直接把新创建的DOM节点添加到容器的子节点末尾,同样不会影响原有内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:42:20