contentEdit字段,用于在数据库输入时维护换行符



我有一个属性为contentEditable的div集。

这使我可以拥有一个自由格式的可编辑文本区域,而不需要任何表单输入字段:http://jsfiddle.net/M8wx9/8/

然而,当我创建几行新行并单击保存按钮时,我会使用.text()方法获取内容,该方法会删除我刚刚输入的换行符。如果可能的话,我需要维护换行符,并将内容以纯文本形式存储在数据库中。

我可以使用.html()而不是.text()将HTML直接存储到数据库中,但我不喜欢这种想法,因为我将来可能需要将这些数据提取为纯文本。此外,在Firefox中按回车键会用<br>换行,Chrome和Safari会用<div>...</div>换行,Internet Explorer和Opera会用段落<p>...</p>换行,所以解析html听起来并不容易。

如何保留这些换行符并将内容以纯文本形式存储在数据库中(类似于文本区域的方式)?

谨致问候,ns

jQuery在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>的内容,所以我们可以照原样处理。

最新更新