Najłatwiejszym rozwiązaniem jest po prostu stylizowanie elementu, do którego wstawiany jest tekst, za pomocą następującej właściwości CSS:
white-space: pre-wrap;
Ta właściwość powoduje, że białe znaki i znaki nowej linii w pasujących elementach są traktowane w taki sam sposób, jak wewnątrz <textarea>. Oznacza to, że kolejne białe spacje nie są zwijane, a wiersze są przerywane w jawnych nowych wierszach (ale są również automatycznie zawijane, jeśli przekraczają szerokość elementu).
Biorąc pod uwagę, że kilka z opublikowanych tutaj odpowiedzi było podatnych na wstrzyknięcie HTML (np. Ponieważ przypisują one niezmienione dane wejściowe użytkownika do innerHTML) lub w inny sposób błędne, pozwól mi podać przykład, jak to zrobić bezpiecznie i poprawnie, w oparciu o oryginalny kod:
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>
Zwróć uwagę, że podobnie jak w oryginalnym kodzie powyższy fragment używa append()i prepend(). W chwili pisania tego tekstu funkcje te są nadal uważane za eksperymentalne i nie są w pełni obsługiwane przez wszystkie przeglądarki. Jeśli chcesz być bezpieczny i zachować zgodność ze starszymi przeglądarkami, możesz łatwo je zastąpić w następujący sposób:
element.append(otherElement)można zastąpić element.appendChild(otherElement);
element.prepend(otherElement)można zastąpić element.insertBefore(otherElement, element.firstChild);
element.append(stringOfText)można zastąpić element.appendChild(document.createTextNode(stringOfText));
element.prepend(stringOfText)można zastąpić element.insertBefore(document.createTextNode(stringOfText), element.firstChild);
- w specjalnym przypadku, jeśli
elementjest pusty, oba element.append(stringOfText)i element.prepend(stringOfText)można je po prostu zastąpić element.textContent = stringOfText.
Oto ten sam fragment co powyżej, ale bez użycia append()lub 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. Jeśli naprawdę chcesz to zrobić bez używania white-spacewłaściwości CSS , alternatywnym rozwiązaniem byłoby jawne zastąpienie wszelkich znaków nowego wiersza w tekście <br>znacznikami HTML. Najtrudniejsze jest to, że aby uniknąć wprowadzania subtelnych błędów i potencjalnych luk w zabezpieczeniach, musisz najpierw usunąć wszelkie metaznaki HTML (co najmniej &i <) w tekście, zanim wykonasz tę zamianę.
Prawdopodobnie najprostszym i najbezpieczniejszym sposobem na zrobienie tego jest pozwolenie przeglądarce na obsługę kodu ucieczki HTML za Ciebie, na przykład:
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>
Zauważ, że chociaż naprawi to podziały wierszy, nie zapobiegnie zwijaniu kolejnych białych znaków przez mechanizm renderujący HTML. Można to (w pewnym sensie) naśladować, zastępując część białych znaków w tekście nierozdzielającymi spacjami, ale szczerze mówiąc, jest to dość skomplikowane w przypadku czegoś, co można trywialnie rozwiązać za pomocą jednej linii CSS.