Solusi termudah adalah dengan hanya memberi gaya pada elemen tempat Anda memasukkan teks dengan properti CSS berikut:
white-space: pre-wrap;
Properti ini menyebabkan spasi dan baris baru di dalam elemen yang cocok diperlakukan dengan cara yang sama seperti di dalam a <textarea>. Artinya, spasi berurutan tidak diciutkan, dan garis diputus pada baris baru yang eksplisit (tetapi juga dibungkus secara otomatis jika melebihi lebar elemen).
Mengingat bahwa beberapa jawaban yang diposting di sini sejauh ini rentan terhadap injeksi HTML (misalnya karena mereka menetapkan masukan pengguna yang tidak lolos innerHTML) atau buggy, izinkan saya memberikan contoh cara melakukannya dengan aman dan benar, berdasarkan kode asli Anda:
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>
Perhatikan bahwa, seperti kode asli Anda, cuplikan di atas menggunakan append()dan prepend(). Sampai tulisan ini dibuat, fungsi-fungsi tersebut masih dianggap eksperimental dan tidak didukung sepenuhnya oleh semua browser. Jika Anda ingin aman dan tetap kompatibel dengan browser lama, Anda dapat menggantinya dengan mudah seperti berikut:
element.append(otherElement)bisa diganti dengan element.appendChild(otherElement);
element.prepend(otherElement)bisa diganti dengan element.insertBefore(otherElement, element.firstChild);
element.append(stringOfText)bisa diganti dengan element.appendChild(document.createTextNode(stringOfText));
element.prepend(stringOfText)bisa diganti dengan element.insertBefore(document.createTextNode(stringOfText), element.firstChild);
- sebagai kasus khusus, jika
elementkosong, keduanya element.append(stringOfText)dan element.prepend(stringOfText)dapat dengan mudah diganti element.textContent = stringOfText.
Berikut cuplikan yang sama seperti di atas, tetapi tanpa menggunakan append()atau 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. Jika Anda benar-benar ingin melakukan ini tanpa menggunakan white-spaceproperti CSS , solusi alternatifnya adalah mengganti secara eksplisit karakter baris baru apa pun dalam teks dengan <br>tag HTML. Bagian yang sulit adalah, untuk menghindari munculnya bug halus dan potensi celah keamanan, Anda harus terlebih dahulu keluar dari semua karakter meta HTML (minimal, &dan <) dalam teks sebelum Anda melakukan penggantian ini.
Mungkin cara termudah dan teraman untuk melakukannya adalah dengan membiarkan browser menangani pelolosan HTML untuk Anda, seperti ini:
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>
Perhatikan bahwa, meskipun ini akan memperbaiki jeda baris, ini tidak akan mencegah spasi kosong yang berurutan diciutkan oleh perender HTML. Dimungkinkan untuk (semacam) meniru itu dengan mengganti beberapa spasi putih dalam teks dengan spasi non-breaking, tapi sejujurnya, itu menjadi agak rumit untuk sesuatu yang dapat diselesaikan dengan mudah dengan satu baris CSS.