2013-04-23 89 views
16

我有<textarea><div>(其中<p>裏面)。 當在該區域中輸入文本時,<p>會在keyUp時使用內容進行更新。從textarea複製到div,保留換行符

有沒有辦法從textarea保留換行符(新行),並以某種方式讓它們像div/p中的換行符一樣工作?

</p><p>取代雙「新線」,這是否也可能?這幾乎是一個偉大的工作,但不希望爲此,這是一個非常小的項目。


這就是我到目前爲止。

$(".box textarea").keyup(function() { 
    var value = $(this).val(); 
    $('.box p').text(value); 
}); 

回答

13

您可以簡單地這樣做:

$('.box textarea').keyup(function() { 
    var value = $(this).val().replace(/\n/g, '<br/>'); 
    $(".box p").html(value); 
}); 

這將替換所有行的textarea元件切斷\n與HTML <br/>標籤全部更換,這樣就可以保持在換行符你的textarea裏面還有<p>標籤元素。

簡單的演示在這裏:

$('.box textarea').keyup(function() { 
 
    $(".box p").html(this.value.replace(/\n/g, '<br/>')); 
 
});
textarea,p { 
 
    width: 90%; 
 
    height: 80px; 
 
} 
 
p { 
 
    border: 1px solid #eee; 
 
    padding: 5px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="box"> 
 
    <textarea></textarea> 
 
    <br/> 
 
    <p></p> 
 
</div>

如果你可以改變你的CSS文件,那麼你也可以嘗試以下解決方案通過@Explosion丸的建議。即使你將不得不在這裏仍然使用jQuery代碼到textarea輸入的文本添加到p標籤上keyup事件,如:

$('.box textarea').keyup(function() { 
 
    $(".box p").html(this.value); // replace is not needed here 
 
});
textarea,p { 
 
    width: 90%; 
 
    height: 80px; 
 
} 
 
p { 
 
    border: 1px solid #eee; 
 
    padding: 5px; 
 
    white-space: pre; // <--- This is the important part 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="box"> 
 
    <textarea></textarea> 
 
    <br/> 
 
    <p></p> 
 
</div>

+1

一直在這種解決方案周圍徘徊了一個小時左右,但無法得到它的工作。謝謝一堆! – Xavio 2013-04-23 09:21:37

+0

很高興幫助! – 2013-04-23 09:27:40

+1

@Xavio請注意,如果你的textarea包含帶有HTML標籤的文本(假定你不想被解釋),這將失敗。當然,你可以分別用'<'和'>'替換'<' and '>',但是使用'white-space' CSS規則要乾淨得多。 – 2013-04-23 09:31:27

39

你可能要添加的CSS規則white-space: prewhite-space: pre-wrap.box p。這將顯示空白。

+2

這可能是最好的答案。 – 2013-08-21 04:43:02

+4

這應該是被接受的答案。換行符是換行符,而不是新的段落,並且使用css代替jQuery始終是首選解決方案。恕我直言... – 2014-01-31 10:56:47

+0

感謝您爲我提供的美妙解決方案。 – barsan 2016-11-28 13:05:26

-2

使用string.replace("\n", "<br/>")將文本區域中的換行符替換爲頁面中的新行。

的JavaScript:

<script type="text/javascript"> 
function ta() 
{ 
taValue = document.getElementById("ta").value; 
taValue = taValue.replace("\n", "<br/>"); 
document.getElementById("tatext").innerHTML = taValue; 
} 
</script> 

HTML:

<textarea id="ta" onkeyup="ta()"></textarea> 
<div id="tatext"></div> 
+0

-1:這只是Palash Mondal的不完整答案(不必要的羅嗦)重複。 – 2013-04-23 09:33:59

+0

...也有同樣的安全缺陷。 – 2016-11-04 15:54:11

+0

在這裏評論的人我不明白你爲什麼看到這是壞的。它是有效的,如果它是你所說的重複的話,那麼請確保鏈接是所謂的重複,以便這可以被誠實地標記,而不僅僅基於某些機構的建議或意見。 @RaphaelSchweikert – SeekLoad 2017-03-15 16:19:44

2

這是最簡單,最安全的純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,並且可能不會生成一致的結果不同的瀏覽器。)