我有一个属性为contentEditable的div集。
这使我可以拥有一个自由格式的可编辑文本区域,而不需要任何表单输入字段:http://jsfiddle.net/M8wx9/8/
然而,当我创建几行新行并单击保存按钮时,我会使用.text()
方法获取内容,该方法会删除我刚刚输入的换行符。如果可能的话,我需要维护换行符,并将内容以纯文本形式存储在数据库中。
我可以使用.html()
而不是.text()
将HTML直接存储到数据库中,但我不喜欢这种想法,因为我将来可能需要将这些数据提取为纯文本。此外,在Firefox中按回车键会用<br>
换行,Chrome和Safari会用<div>...</div>
换行,Internet Explorer和Opera会用段落<p>...</p>
换行,所以解析html听起来并不容易。
如何保留这些换行符并将内容以纯文本形式存储在数据库中(类似于文本区域的方式)?
谨致问候,ns
Node
上使用textContent
来返回元素的文本值,这将压缩空白。如果希望保留换行符,则需要使用innerText
,这意味着直接访问元素,而不是通过jQuery。
来自您的jsfiddle:
console.log($(Comments)[0].innerText);
http://jsfiddle.net/M8wx9/10/
====update:
需要注意的是(正如Tim Down所指出的),使用innerText
只能在webkit和microsoft浏览器中使用。如果您的应用程序也支持Firefox,则需要在innerHTML上使用正则表达式来维护换行符。例如:
$(Comments).html().trim()
.replace(/<br(s*)/*>/ig, 'n') // replace single line-breaks
.replace(/<[p|div]s/ig, 'n$0') // add a line break before all div and p tags
.replace(/(<([^>]+)>)/ig, ""); // remove any remaining tags
http://jsfiddle.net/M8wx9/12/
正如评论中提到的,前一个在Chrome中不起作用。这是一个有效的解决方案:
$(Comments).html().trim()
.replace(/<brs*/*>/ig, 'n')
.replace(/(<(p|div))/ig, 'n$1')
.replace(/(<([^>]+)>)/ig, "");
http://jsfiddle.net/M8wx9/81/
function readContentWithBreaks(elem){
if(elem[0].innerText){
return elem[0].innerText.replace(/n/ig,"<br>");
}else{
return elem.html();
}
}
由于webkit浏览器支持innerText,我决定检测它们添加的/n。对于Firefox,它已经提供了<br>
的内容,所以我们可以照原样处理。