InnerText JavaScript丢失开头换行符?

vq8itlhq  于 2023-01-16  发布在  Java
关注(0)|答案(2)|浏览(182)

我在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;
}
af7jpaap

af7jpaap1#

默认情况下,HTML中的新行不会解释为要在屏幕上呈现的新行。您可以执行以下操作之一:

  • white-space: pre;属性添加到.modal-content。此元素现在将考虑回车符。
  • 使用innerHTML并附加<br/>标记,而不是附加回车符(\n)。

您可能还希望使用\r\n而不仅仅是\n,否则它可能无法在windows浏览器上正常工作。

oug3syen

oug3syen2#

溶液

您的btn.onclick处理程序应该被修改。以下任何一项都应该起作用:
1.通过将代码片段收集到变量中,并且仅在循环设置innerText之后,避免在模态隐藏时读取innerText

console.log(classNameCode);
let code = '';
for(var key in classNameCode){
    var codeToAppend = `${classNameCode[key]} \n}`;
    console.log(codeToAppend);
    code += codeToAppend;
}
modalContent.innerText = code; // avoid reading innerText when modal is hidden
modal.style.display = "block";

1.为了避免innerText对隐藏元素的意外读取行为,首先要使其可见。为此,可以将modal.style.display = "block";移动到btn.onclick处理函数的开头:

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

原因

虽然将包含换行符的值写入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。

相关问题