Giải pháp đơn giản nhất là chỉ cần tạo kiểu cho phần tử bạn đang chèn văn bản vào bằng thuộc tính CSS sau:
white-space: pre-wrap;
Thuộc tính này làm cho khoảng trắng và dòng mới trong các phần tử phù hợp được xử lý giống như bên trong a <textarea>. Nghĩa là, khoảng trắng liên tiếp không được thu gọn và các dòng bị ngắt ở các dòng mới rõ ràng (nhưng cũng được bao bọc tự động nếu chúng vượt quá chiều rộng của phần tử).
Do một số câu trả lời được đăng ở đây cho đến nay dễ bị chèn HTML (ví dụ: vì họ gán đầu vào của người dùng không thoát cho innerHTML) hoặc có lỗi, hãy để tôi đưa ra một ví dụ về cách thực hiện điều này một cách an toàn và chính xác, dựa trên mã gốc của bạn:
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>
Lưu ý rằng, giống như mã gốc của bạn, đoạn mã ở trên sử dụng append()và prepend(). Tại thời điểm viết bài này, những chức năng đó vẫn được coi là thử nghiệm và không được hỗ trợ đầy đủ bởi tất cả các trình duyệt. Nếu bạn muốn an toàn và vẫn tương thích với các trình duyệt cũ hơn, bạn có thể thay thế chúng khá dễ dàng như sau:
element.append(otherElement)có thể được thay thế bằng element.appendChild(otherElement);
element.prepend(otherElement)có thể được thay thế bằng element.insertBefore(otherElement, element.firstChild);
element.append(stringOfText)có thể được thay thế bằng element.appendChild(document.createTextNode(stringOfText));
element.prepend(stringOfText)có thể được thay thế bằng element.insertBefore(document.createTextNode(stringOfText), element.firstChild);
- như một trường hợp đặc biệt, nếu
elementtrống, cả hai element.append(stringOfText)và element.prepend(stringOfText)chỉ có thể được thay thế bằng element.textContent = stringOfText.
Đây là đoạn mã tương tự như trên, nhưng không sử dụng append()hoặc 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. Nếu bạn thực sự muốn làm điều này mà không sử dụng thuộc tính CSS white-space, một giải pháp thay thế sẽ là thay thế rõ ràng bất kỳ ký tự dòng mới nào trong văn bản bằng <br>các thẻ HTML. Phần khó khăn là, để tránh đưa vào các lỗi tinh vi và các lỗ hổng bảo mật tiềm ẩn, trước tiên bạn phải thoát khỏi bất kỳ siêu ký tự HTML nào (tối thiểu &và <) trong văn bản trước khi thực hiện thay thế này.
Có lẽ cách đơn giản và an toàn nhất để làm điều đó là để trình duyệt xử lý việc thoát HTML cho bạn, như sau:
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>
Lưu ý rằng, mặc dù điều này sẽ sửa lỗi ngắt dòng, nhưng nó sẽ không ngăn các khoảng trắng liên tiếp bị thu gọn bởi trình kết xuất HTML. Có thể (đại loại) mô phỏng điều đó bằng cách thay thế một số khoảng trắng trong văn bản bằng các khoảng trắng không ngắt, nhưng thành thật mà nói, điều đó trở nên khá phức tạp đối với một thứ có thể được giải quyết bằng một dòng CSS.