วิธีแก้ปัญหาที่ง่ายที่สุดคือจัดรูปแบบองค์ประกอบที่คุณกำลังแทรกข้อความด้วยคุณสมบัติ CSS ต่อไปนี้:
white-space: pre-wrap;
คุณสมบัตินี้ทำให้ช่องว่างและขึ้นบรรทัดใหม่ภายในองค์ประกอบที่ตรงกันได้รับการปฏิบัติในลักษณะเดียวกับภายใน a <textarea>. นั่นคือช่องว่างที่ต่อเนื่องกันจะไม่ยุบและเส้นจะขาดที่บรรทัดใหม่ที่ชัดเจน (แต่จะถูกพันโดยอัตโนมัติหากเกินความกว้างขององค์ประกอบ)
เนื่องจากคำตอบหลายข้อที่โพสต์ไว้ที่นี่มีความเสี่ยงต่อการแทรก HTML (เช่นเนื่องจากพวกเขากำหนดอินพุตของผู้ใช้ที่ไม่ใช้ Escape 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 บรรทัดเดียว