我在HTML中有一个modal,我试图在它的InnerText
属性中添加一些文本,但是似乎有一个换行符被忽略了。例如,我希望它是这样的:
class Student{
}
class AG{
}
但事实上,它是:
class Student{ }
class AG{
}
我试着添加更多的换行符,删除一些额外的换行符,但没有任何效果。我试着使用InnterHTML
属性,但也没有解决问题。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>
联森:
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);
// generatedCode = `class ${classTitle.value} {\n\t`
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;
}
2条答案
按热度按时间af7jpaap1#
默认情况下,HTML中的新行不会解释为要在屏幕上呈现的新行。您可以执行以下操作之一:
white-space: pre;
属性添加到.modal-content
。此元素现在将考虑回车符。innerHTML
并附加<br/>
标记,而不是附加回车符(\n
)。您可能还希望使用
\r\n
而不仅仅是\n
,否则它可能无法在windows浏览器上正常工作。oug3syen2#
溶液
您的
btn.onclick
处理程序应该被修改。以下任何一项都应该起作用:1.通过将代码片段收集到变量中,并且仅在循环设置
innerText
之后,避免在模态隐藏时读取innerText
:1.为了避免
innerText
对隐藏元素的意外读取行为,首先要使其可见。为此,可以将modal.style.display = "block";
移动到btn.onclick
处理函数的开头:原因
虽然将包含换行符的值写入
innerText
始终会创建<br>
元素,但从 * hidden * 元素读取该值的行为会有所不同:它忽略后代<br>
元素。在
btn.onclick
处理程序中,您写入了.innerText += ...
,这意味着读取当前值并在下一步中写入。在循环的第二次迭代中,读取现有的
innerText
,它返回第一次迭代中没有换行符的文本 *(尽管DOM中有一个<br>
),然后编写这个和第二个codeToAppend
的连接,后者最终从模态内容中删除第一次迭代中的换行符。研究
我已经将您的代码复制到本地文件中,并简化了示例,直到找到真正的原因:
.modal { display: none; }
处于活动状态时,可以观察到不良行为。如果没有该样式,则会根据需要添加新行。所以我发现罪魁祸首是
display: none
,它似乎对innerText
的工作方式有影响。查看
innerText
的HTML规范似乎可以证实这一点,因为它提到了对不呈现元素的情况的特殊处理。该条特别指出:
如果没有呈现,或者用户代理是非CSS用户代理,则返回其后代文本内容。
descendant text content
定义为:节点node的后代文本内容是node的所有Text节点后代的数据按树顺序串联而成。
显然,这不包括
<br>
元素,这就是innerText
不包含所需换行符的原因。innerText
规范只在呈现元素的情况下提到了<br>
的特殊处理。特别是,它指出,对于每个呈现的后代节点,将执行呈现的文本集合步骤,这些步骤包含:如果node是
br
元素,则将包含单个U +000A LF码位的字符串附加到items。