这里是最简单最安全的纯 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 属性,则需要先转义输入中的任何 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>tags 替换单个换行。
(请注意,为了在输出中允许多个段落,目标元素应该是<div>,而不是<p>元素。将一个<p>元素嵌套在另一个元素中不是有效的HTML,并且可能在不同的浏览器上不会产生一致的结果。)