Đây là giải pháp jQuery tinh khiết đơn giản nhất và an toàn nhất:
$(".box textarea").keyup(function() {
var value = $(this).val();
$('.box p').text(value).css('white-space', 'pre-wrap');
});
Tất nhiên, nếu bạn có thể thêm .box p { white-space: pre-wrap }
để CSS tĩnh của bạn phong cách, sau đó bạn không cần phải tiêm nó với jQuery.
(Cũng lưu ý rằng white-space: pre-wrap
cũng khiến nhiều không gian liên tiếp được giữ nguyên và không bị thu gọn thành một dấu cách.Nếu bạn không muốn điều đó, nhưng vẫn muốn duy trì ngắt dòng, hãy sử dụng white-space: pre-line
để thay thế.)
Ps. Bạn nên nhập không bao gồm (ví dụ như câu trả lời hiện đang chấp nhận), vì làm như vậy sẽ gây ra đầu ra bị xén nếu đầu vào chứa bất kỳ siêu ký tự HTML nào như &
hoặc <
và cũng có thể mở bạn thành HTML injection và cross Tấn công kịch bản lệnh (XSS) nếu đầu vào có thể bị ảnh hưởng bởi kẻ tấn công độc hại.
Nếu bạn hoàn toàn khăng khăng không sử dụng thuộc tính CSS white-space
dưới bất kỳ hình thức nào, trước tiên bạn cần phải thoát khỏi bất kỳ siêu ký tự HTML nào trước khi thêm <br>
thẻ vào đó. Có lẽ cách đơn giản nhất và an toàn nhất để làm điều đó là để trình duyệt xử lý việc thoát cho bạn, ví dụ: như thế này:
$(".box textarea").keyup(function() {
var value = $(this).val();
$('.box div.output').text(value).html(function (index, html) {
return '<p>' + html.replace(/[^\S\n]+\n/g, '\n').replace(/\n\n+/g, '</p><p>').replace(/\n/g, '<br>') + '</p>';
});
});
này sẽ đầu tiên sao chép văn bản đầu vào thành các yếu tố mục tiêu sử dụng .text()
(tự động HTML-thoát nó) và sau đó sẽ thay đổi kết quả HTML để loại bỏ dấu khoảng trắng từ đường nét, sụp đổ nhiều các dòng lệnh liên tiếp thành các ngắt đoạn và cuối cùng là thay thế các dòng đơn lẻ bằng các thẻ <br>
.
(Lưu ý rằng, để cho phép nhiều đoạn văn bản trong đầu ra, phần tử đích thực sự là <div>
, không phải là một phần tử <p>
trong phần tử khác không phải là HTML hợp lệ và có thể không tạo ra kết quả phù hợp các trình duyệt khác nhau.)
Đã lang thang xung quanh loại giải pháp này trong một giờ hoặc lâu hơn, nhưng không thể làm cho nó hoạt động. Cảm ơn nhiều! – Xavio
Rất vui được giúp! –
@Xavio Lưu ý rằng điều này sẽ thất bại nếu vùng văn bản của bạn chứa văn bản có thẻ HTML (có lẽ, bạn không muốn muốn được giải thích). Được cấp, bạn có thể thay thế '<' and '>' bằng '<' và '>', nhưng sử dụng quy tắc CSS 'không gian trắng 'sạch hơn nhiều. –