这是最简单和最安全的纯 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 元字符(如&
or ),这样做会导致输出错误<
,并且还可以打开您的 HTML 注入和跨站点脚本(XSS ) 攻击,如果输入可能受到恶意攻击者的影响。
如果您绝对坚持不white-space
以任何形式使用 CSS 属性,则需要先转义输入中的任何 HTML 元字符,然后再将<br>
标签添加到其中。可能最简单和最安全的方法是让浏览器为您处理转义,例如:
$(".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>
标签。
(注意,为了在输出中允许多个段落,目标元素实际上应该是 a <div>
,而不是<p>
元素。将一个元素嵌套<p>
在另一个元素中是无效的 HTML,并且可能不会在不同的浏览器上产生一致的结果。)