Самое простое решение - просто стилизовать элемент, в который вы вставляете текст, с помощью следующего свойства CSS:
white-space: pre-wrap;
Это свойство заставляет пробелы и символы новой строки в совпадающих элементах обрабатываться так же, как внутри <textarea>
. То есть последовательные пробелы не сворачиваются, а строки разбиваются на явные символы новой строки (но также автоматически переносятся, если они превышают ширину элемента).
Учитывая, что некоторые из ответов, опубликованных здесь до сих пор, были уязвимы для HTML-инъекции (например, потому, что они назначают неэкранированный ввод пользователя innerHTML
) или иным образом содержат ошибки, позвольте мне привести пример того, как это сделать безопасно и правильно, на основе вашего исходного кода:
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>
Обратите внимание, что, как и в исходном коде, в приведенном выше фрагменте используются append()
и prepend()
. На момент написания эти функции все еще считаются экспериментальными и не полностью поддерживаются всеми браузерами. Если вы хотите быть в безопасности и оставаться совместимым со старыми браузерами, вы можете легко заменить их следующим образом:
element.append(otherElement)
можно заменить на element.appendChild(otherElement)
;
element.prepend(otherElement)
можно заменить на element.insertBefore(otherElement, element.firstChild)
;
element.append(stringOfText)
можно заменить на element.appendChild(document.createTextNode(stringOfText))
;
element.prepend(stringOfText)
можно заменить на element.insertBefore(document.createTextNode(stringOfText), element.firstChild)
;
- как особый случай, если
element
пусто, оба element.append(stringOfText)
и element.prepend(stringOfText)
могут быть просто заменены на element.textContent = stringOfText
.
Вот тот же фрагмент, что и выше, но без использования append()
или 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>
Пс. Если вы действительно хотите сделать это без использования white-space
свойства CSS , альтернативным решением будет явная замена любых символов новой строки в тексте <br>
тегами HTML. Сложность заключается в том, что во избежание появления тонких ошибок и потенциальных дыр в безопасности вы должны сначала избежать любых метасимволов HTML (как минимум, &
и <
) в тексте, прежде чем выполнять эту замену.
Вероятно, самый простой и безопасный способ сделать это - позволить браузеру обрабатывать HTML-экранирование за вас, например:
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>
Обратите внимание, что, хотя это и исправит разрывы строк, это не предотвратит удаление последовательных пробелов средством визуализации HTML. Это можно (вроде как) имитировать, заменив некоторые пробелы в тексте неразрывными пробелами, но, честно говоря, это становится довольно сложным для чего-то, что можно тривиально решить с помощью одной строки CSS.