我正在使用jQuery将一些文本区域的内容插入到一个li中。
我希望它可以保留换行符并在视觉上表现出来。
肯定有一种非常简单的方法来实现这个...
我正在使用jQuery将一些文本区域的内容插入到一个li中。
我希望它可以保留换行符并在视觉上表现出来。
肯定有一种非常简单的方法来实现这个...
演示: http://so.devilmaycode.it/jquery-convert-line-breaks-to-br-nl2br-equivalent
function nl2br (str, is_xhtml) {
var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';
return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');
}
你可以简单地执行以下操作:
textAreaContent=textAreaContent.replace(/\n/g,"<br>");
为了改变渲染而不是改变内容,以下CSS使每个换行符的行为类似于<br>
:
white-space: pre;
white-space: pre-line;
pre-line
只影响换行符(感谢@KevinPauli的提示)。IE6-7和其他旧浏览器回退到更极端的pre
,它也包括nowrap
并呈现多个空格。这些和其他设置(pre-wrap
)的详细信息在mozilla 和css-tricks上 (感谢@Sablefoste)。<br>
标记替换换行符可能会增加使用未过滤的用户输入的注入攻击的风险。你正在越过一个明显的红线,每当你发现自己将.text()
调用更改为.html()
时,这意味着字面上的问题必须被解决。(感谢@AlexS强调了这一点。)即使你在当时排除了安全风险,未来的更改也可能无意中引入它。相反,这个CSS允许你使用更安全的.text()
获得硬性换行符而不需要标记。white-space:
选项,例如pre-wrap
。请参见https://css-tricks.com/almanac/properties/w/whitespace/。 - Sablefoste.html()
来设置内容,这反过来又会允许用户插入任意HTML,除非您事先过滤掉它。 - Alex S.html()
的危险之处,这是一个很好的观点,我尝试将其融入进去。 - Bob Stein将以下代码放入你的代码中(最好是通用的JS函数库中):
String.prototype.nl2br = function()
{
return this.replace(/\n/g, "<br />");
}
用法:
var myString = "test\ntest2";
myString.nl2br();
创建一个字符串原型函数允许您在任何字符串上使用this。
jQuery.nl2br = function(varTest){
return varTest.replace(/(\r\n|\n\r|\r|\n)/g, "<br>");
};
/**
* This function is same as PHP's nl2br() with default parameters.
*
* @param {string} str Input text
* @param {boolean} replaceMode Use replace instead of insert
* @param {boolean} isXhtml Use XHTML
* @return {string} Filtered text
*/
function nl2br (str, replaceMode, isXhtml) {
var breakTag = (isXhtml) ? '<br />' : '<br>';
var replaceStr = (replaceMode) ? '$1'+ breakTag : '$1'+ breakTag +'$2';
return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, replaceStr);
}
$.fn.nl2brText = function (sText) {
var bReturnValue = 'undefined' == typeof sText;
if(bReturnValue) {
sText = $('<pre>').html(this.html().replace(/<br[^>]*>/i, '\n')).text();
}
var aElms = [];
sText.split(/\r\n|\r|\n/).forEach(function(sSubstring) {
if(aElms.length) {
aElms.push(document.createElement('br'));
}
aElms.push(document.createTextNode(sSubstring));
});
var $aElms = $(aElms);
if(bReturnValue) {
return $aElms;
}
return this.empty().append($aElms);
};
另一种在DOM中插入来自文本区域的文本并保留换行符的方法是使用Node.innerText属性,它表示节点及其后代的呈现文本内容。
作为getter,它近似于用户如果使用光标突出显示元素内容,然后复制到剪贴板时获得的文本。
该属性已成为标准,受到现代浏览器的广泛支持。 Can I Use:我发布此答案时全球范围内覆盖率达到97%。
为了改进@Luca Filosofi的答案,
如果需要的话,将正则表达式的开始子句改为/([^>[\s]?\r\n]?)
还可以忽略标签后面紧跟换行符且有空格的情况,而不仅仅是标签紧跟换行符。