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

JavaScript设置InnerText时开头换行丢失问题求助

问题:模态框中InnerText追加文本时开头换行被忽略

我在HTML中实现了一个模态框,尝试向其innerText属性追加文本,但发现开头的一处换行被忽略。

预期显示:

class Student{

}
class AG{

}

实际显示:

class Student{ }
class AG{

}

我尝试过增加、删除换行,也试过使用innerHTML属性,均未解决问题。以下是相关代码:

JavaScript代码

var generatedCode = "";
var classNameCode = {};

document.getElementById("create-box").addEventListener("click", function() {
  let box = document.createElement("div");
  box.classList.add("box");
  let title = document.createElement("h2");
  title.innerHTML = "Class";
  box.appendChild(title);
  let classTitle = document.createElement('input');
  classTitle.classList.add('class-name-form');
  let classTitleBtn = document.createElement('button');
  classTitleBtn.innerText = "Set Class Name";
  classTitle.classList.add('class-name-btn');
  box.appendChild(classTitle);
  box.appendChild(classTitleBtn);
  document.getElementById("box-container").appendChild(box);
  let createSubclassButton = document.createElement("button");
  createSubclassButton.innerHTML = "Add Method";
  box.appendChild(createSubclassButton);

  // Enable resizing and dragging
  box.addEventListener("mousedown", startDrag);
  box.addEventListener("mousemove", drag);
  box.addEventListener("mouseup", endDrag);
  box.addEventListener("mouseleave", endDrag);

  let offset = [0, 0];
  let isDown = false;

  function startDrag(e) {
    isDown = true;
    offset = [
      this.offsetLeft - e.clientX,
      this.offsetTop - e.clientY
    ];
  }

  function drag(e) {
    if (!isDown) return;
    e.preventDefault();
    this.style.left = (e.clientX + offset[0]) + 'px';
    this.style.top = (e.clientY + offset[1]) + 'px';
  }

  function endDrag(e) {
    isDown = false;
  }

  createSubclassButton.addEventListener("click", function() {
    let subBox = document.createElement("div");
    subBox.classList.add("subbox");
    let subTitle = document.createElement("h2");
    subTitle.innerText = "New Method";
    subBox.append(subTitle);
    document.getElementById("box-container").appendChild(subBox);
    subBox.style.left = box.offsetLeft + box.offsetWidth + 10 + 'px';
    subBox.style.top = box.offsetTop + 'px';

    // Enable resizing and dragging for the subbox
    subBox.addEventListener("mousedown", startDrag);
    subBox.addEventListener("mousemove", drag);
    subBox.addEventListener("mouseup", endDrag);
    subBox.addEventListener("mouseleave", endDrag);
  });

  classTitleBtn.addEventListener("click", function() {
    console.log(classTitle.value);
    classNameCode[classTitle.value] = `\nclass ${classTitle.value} {\n`
  });
});

// MODAL FOR CODE GENERATION
var modal = document.getElementById("myModal");
var btn = document.getElementById("myBtn");
var modalContent = document.querySelector('.modal-content');

btn.onclick = function() {
  modalContent.innerText = "";
  console.log(classNameCode);
  for (var key in classNameCode) {
    var codeToAppend = `${classNameCode[key]} \n}`;
    console.log(codeToAppend);
    modalContent.innerText += codeToAppend;
  }
  modal.style.display = "block";
}

window.onclick = function(event) {
  if (event.target == modal) {
    modal.style.display = "none";
  }
}

CSS代码

body {
  background-size: 40px 40px;
  background-image: radial-gradient(circle, #000000 1px, rgba(0, 0, 0, 0) 1px);
  background-color: darkgray;
}

#create-box {
  padding: 10px 20px;
  background-color: #4CAF50;
  border-radius: 5px;
  border: none;
  color: white;
}

#create-box:hover {
  background-color: #5dc861;
  cursor: pointer;
}

#create-box:active {
  cursor: pointer
}

.box {
  position: absolute;
  width: 200px;
  height: 200px;
  background-color: #f1f1f1;
  border: 1px solid #d3d3d3;
  border-radius: 5px;
  resize: both;
  overflow: auto;
  z-index: 1;
}

.box h2 {
  margin: 0;
  padding: 10px;
}

.subbox {
  width: 100px;
  height: 100px;
  background-color: #f1f1f1;
  border: 1px solid #d3d3d3;
  position: absolute;
  z-index: 1;
  border-radius: 5px;
}

/* The Modal (background) */
.modal {
  display: none;
  /* Hidden by default */
  position: fixed;
  /* Stay in place */
  z-index: 1;
  /* Sit on top */
  left: 0;
  top: 0;
  width: 100%;
  /* Full width */
  height: 100%;
  /* Full height */
  overflow: auto;
  /* Enable scroll if needed */
  background-color: rgb(0, 0, 0);
  /* Fallback color */
  background-color: rgba(0, 0, 0, 0.4);
  /* Black w/ opacity */
}

/* Modal Content/Box */
.modal-content {
  background-color: #fefefe;
  margin: 15% auto;
  /* 15% from the top and centered */
  padding: 20px;
  border: 1px solid #888;
  width: 80%;
  /* Could be more or less, depending on screen size */
}

/* The Close Button */
.close {
  color: #aaa;
  float: right;
  font-size: 28px;
  font-weight: bold;
}

.close:hover,
.close:focus {
  color: black;
  text-decoration: none;
  cursor: pointer;
}

#myBtn {
  padding: 10px 20px;
  background-color: #4CAF50;
  border-radius: 5px;
  border: none;
  color: white;
}

#myBtn:hover {
  background-color: #5dc861;
  cursor: pointer;
}

#myBtn:active {
  cursor: pointer
}

#buttons {
  text-align: center;
}

HTML代码

<div id="buttons">
  <button id="create-box">Create Class</button>
  <button id="myBtn">View Code (C++)</button>
</div>
<div id="box-container"></div>
<div id="myModal" class="modal">
  <div class="modal-content">
    <p></p>
  </div>
</div>
<script src="main.js"></script>

解决方案

问题根源在于浏览器默认会合并文本中的连续空白字符(包括换行、空格),而你的模态框内容区域没有设置保留空白的样式,导致换行被压缩成空格。同时代码拼接时的多余空格也加剧了这个问题。

步骤1:修复代码拼接逻辑

去掉codeToAppend中多余的空格,确保类内部的换行正确:

// 原代码
var codeToAppend = `${classNameCode[key]} \n}`;
// 修改为
var codeToAppend = `${classNameCode[key]}\n}`;

这样每个类的结构会变成\nclass X {\n\n},保证{和}之间有一个空行。

步骤2:设置模态框内容的空白保留样式

有两种方式实现:

方式一:给.modal-content添加CSS样式

在CSS的.modal-content规则中加入white-space: pre-wrap,这样浏览器会保留换行和空格,同时自动换行:

.modal-content {
  background-color: #fefefe;
  margin: 15% auto;
  padding: 20px;
  border: 1px solid #888;
  width: 80%;
  white-space: pre-wrap; /* 添加这一行 */
}

方式二:使用<pre>标签包裹代码

修改HTML的模态框结构,用<pre>标签来显示代码,<pre>默认会保留所有空白格式:

<div id="myModal" class="modal">
  <div class="modal-content">
    <pre id="code-display"></pre> <!-- 替换原来的<p> -->
  </div>
</div>

然后修改JavaScript中设置文本的部分,将内容设置到<pre>元素:

// 原代码
var modalContent = document.querySelector('.modal-content');
// 修改为
var modalContent = document.getElementById('code-display');

最终效果

修改后,模态框中的代码会正确显示空行,符合预期:

class Student{

}
class AG{

}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:21:36