Die einfachste Lösung besteht darin, das Element, in das Sie den Text einfügen, einfach mit der folgenden CSS-Eigenschaft zu formatieren:
white-space: pre-wrap;
Diese Eigenschaft bewirkt, dass Leerzeichen und Zeilenumbrüche in den übereinstimmenden Elementen genauso behandelt werden wie in a <textarea>. Das heißt, aufeinanderfolgende Leerzeichen werden nicht reduziert, und Zeilen werden bei expliziten Zeilenumbrüchen unterbrochen (aber auch automatisch umbrochen, wenn sie die Breite des Elements überschreiten).
Angesichts der Tatsache, dass einige der hier veröffentlichten Antworten bisher anfällig für HTML-Injection waren (z. B. weil sie uneingeschränkte Benutzereingaben zuweisen innerHTML) oder auf andere Weise fehlerhaft sind, möchte ich anhand Ihres Originalcodes ein Beispiel dafür geben, wie dies sicher und korrekt durchgeführt werden kann:
document.getElementById('post-button').addEventListener('click', function () {
var post = document.createElement('p');
var postText = document.getElementById('post-text').value;
post.append(postText);
var card = document.createElement('div');
card.append(post);
var cardStack = document.getElementById('card-stack');
cardStack.prepend(card);
});
#card-stack p {
background: #ddd;
white-space: pre-wrap;
}
textarea {
width: 100%;
}
<textarea id="post-text" class="form-control" rows="8" placeholder="What's up?" required>Group Schedule:
Tuesday practice @ 5th floor (8pm - 11 pm)
Thursday practice @ 5th floor (8pm - 11 pm)
Sunday practice @ (9pm - 12 am)</textarea><br>
<input type="button" id="post-button" value="Post!">
<div id="card-stack"></div>
Beachten Sie, dass das obige Snippet wie Ihr Originalcode append()und verwendet prepend(). Zum jetzigen Zeitpunkt gelten diese Funktionen noch als experimentell und werden nicht von allen Browsern vollständig unterstützt. Wenn Sie sicher sein und mit älteren Browsern kompatibel bleiben möchten, können Sie diese ganz einfach wie folgt ersetzen:
element.append(otherElement)kann ersetzt werden durch element.appendChild(otherElement);
element.prepend(otherElement)kann ersetzt werden durch element.insertBefore(otherElement, element.firstChild);
element.append(stringOfText)kann ersetzt werden durch element.appendChild(document.createTextNode(stringOfText));
element.prepend(stringOfText)kann ersetzt werden durch element.insertBefore(document.createTextNode(stringOfText), element.firstChild);
- als Sonderfall, wenn
elementleer ist, beides element.append(stringOfText)und element.prepend(stringOfText)kann einfach durch ersetzt werden element.textContent = stringOfText.
Hier ist das gleiche Snippet wie oben, jedoch ohne Verwendung von append()oder prepend():
document.getElementById('post-button').addEventListener('click', function () {
var post = document.createElement('p');
var postText = document.getElementById('post-text').value;
post.textContent = postText;
var card = document.createElement('div');
card.appendChild(post);
var cardStack = document.getElementById('card-stack');
cardStack.insertBefore(card, cardStack.firstChild);
});
#card-stack p {
background: #ddd;
white-space: pre-wrap;
}
textarea {
width: 100%;
}
<textarea id="post-text" class="form-control" rows="8" placeholder="What's up?" required>Group Schedule:
Tuesday practice @ 5th floor (8pm - 11 pm)
Thursday practice @ 5th floor (8pm - 11 pm)
Sunday practice @ (9pm - 12 am)</textarea><br>
<input type="button" id="post-button" value="Post!">
<div id="card-stack"></div>
Ps. Wenn Sie dies wirklich ohne Verwendung der CSS- white-spaceEigenschaft tun möchten , besteht eine alternative Lösung darin, alle Zeilenumbrüche im Text explizit durch <br>HTML-Tags zu ersetzen . Der schwierige Teil ist, dass Sie, um subtile Fehler und potenzielle Sicherheitslücken zu vermeiden, zuerst alle HTML-Metazeichen (mindestens &und <) im Text umgehen müssen, bevor Sie diese Ersetzung durchführen.
Der wahrscheinlich einfachste und sicherste Weg, dies zu tun, besteht darin, den Browser das HTML-Escape für Sie wie folgt handhaben zu lassen:
var post = document.createElement('p');
post.textContent = postText;
post.innerHTML = post.innerHTML.replace(/\n/g, '<br>\n');
document.getElementById('post-button').addEventListener('click', function () {
var post = document.createElement('p');
var postText = document.getElementById('post-text').value;
post.textContent = postText;
post.innerHTML = post.innerHTML.replace(/\n/g, '<br>\n');
var card = document.createElement('div');
card.appendChild(post);
var cardStack = document.getElementById('card-stack');
cardStack.insertBefore(card, cardStack.firstChild);
});
#card-stack p {
background: #ddd;
}
textarea {
width: 100%;
}
<textarea id="post-text" class="form-control" rows="8" placeholder="What's up?" required>Group Schedule:
Tuesday practice @ 5th floor (8pm - 11 pm)
Thursday practice @ 5th floor (8pm - 11 pm)
Sunday practice @ (9pm - 12 am)</textarea><br>
<input type="button" id="post-button" value="Post!">
<div id="card-stack"></div>
Beachten Sie, dass dies zwar die Zeilenumbrüche behebt, jedoch nicht verhindert, dass aufeinanderfolgende Leerzeichen vom HTML-Renderer reduziert werden. Es ist möglich, dies zu emulieren, indem ein Teil des Leerzeichens im Text durch nicht unterbrechende Leerzeichen ersetzt wird. Ehrlich gesagt wird dies jedoch für etwas, das mit einer einzigen CSS-Zeile trivial gelöst werden kann, ziemlich kompliziert.