Найпростішим рішенням є просто стиль елемента, до якого ви вставляєте текст, за допомогою наступної властивості CSS:
white-space: pre-wrap;
Ця властивість призводить до того, що пробіли та нові рядки в відповідних елементах обробляються так само, як і всередині a <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>
Ps. Якщо ви дійсно хочете зробити це без використання 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.