這是最簡單,最安全的純jQuery的解決方案:
$(".box textarea").keyup(function() {
var value = $(this).val();
$('.box p').text(value).css('white-space', 'pre-wrap');
});
當然,如果你可以添加.box p { white-space: pre-wrap }
到你的靜態CSS樣式,那麼你不需要用jQuery注入它。
(還請注意,white-space: pre-wrap
也會導致保留多個連續空格,而不是摺疊到一個空格中。如果你不希望出現這種情況,但仍然希望保留換行符,使用white-space: pre-line
代替。)
詩篇。你應該從來沒有通過未轉義的用戶輸入到.html()
(如目前接受的答案),因爲如果輸入包含任何HTML元字符如&
或<
,並且還可以打開HTML注入和交叉如果輸入可能會受到惡意攻擊者的影響,則可以使用本地腳本(XSS)攻擊。
如果您絕對堅持不使用任何形式的CSS white-space
屬性,那麼在將<br>
標籤添加到其中之前,您需要首先轉義輸入中的任何HTML元字符。可能最簡單和最安全的方法就是讓瀏覽器爲你逃脫,例如,像這樣:
$(".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>';
});
});
這將第一輸入文本使用.text()
(自動HTML-逸出它),然後修改生成的HTML代碼,以除去從線尾隨空格複製到目標元件,塌陷多個連續換行進入段落分隔符,最後用<br>
標籤替換單個換行符。 (請注意,爲了允許輸出中有多個段落,目標元素應該是<div>
,而不是<p>
元素。將一個<p>
元素嵌套在另一個元素中不是有效的HTML,並且可能不會生成一致的結果不同的瀏覽器。)
一直在這種解決方案周圍徘徊了一個小時左右,但無法得到它的工作。謝謝一堆! – Xavio 2013-04-23 09:21:37
很高興幫助! – 2013-04-23 09:27:40
@Xavio請注意,如果你的textarea包含帶有HTML標籤的文本(假定你不想被解釋),這將失敗。當然,你可以分別用'<'和'>'替換'<' and '>',但是使用'white-space' CSS規則要乾淨得多。 – 2013-04-23 09:31:27