【问题标题】:Script insert line breaks in div contentEditable脚本在 div contentEditable 中插入换行符
【发布时间】:2025-11-27 17:30:01
【问题描述】:

我有一个网页divcontentEditable=true。用户修改div内容后,系统使用document.getElementById(id).innerHTML获取内容并发送给服务器。这一切正常:

<div id='editBox'; contentEditable='true'></div>
<script>
document.getElementById('editBox').onkeydown=function(e){
    clearTimeout ( backupTimeoutID );
    backupTimeoutID = setTimeout(function(){sendDivContentToServer()},3000);
}
<script>

我使用带有 contentEditable=true 的 div 而不是文本区域的原因是我需要允许在 div 中显示和格式化背景色文本。如果我不知道有什么更好的方法,请告诉我。

我的问题是显示的换行符不一致。如果用户在 div 内按下 return,它会为换行创建另一个 div。所以,当函数获取到innerHtml时,看起来是这样的

first line of text<div>second line of text</div>

有时,在编辑框中粘贴来自其他来源(来自互联网、word 等)的文本时,换行符会显示为 &lt;p&gt;

我希望所有换行符看起来像这样:

first line of text<br>second line of text

我尝试在用户按下返回时更改&lt;div&gt; 的行为;我知道代码可以正常工作,因为如果我尝试插入一个单词而不是 return 它可以工作。但是,当我将代码设置为用 return 代替 &lt;br&gt; 时,它的行为就会异常。这是我为此使用的代码:

<script>
document.getElementById('editBox').onkeydown=function(e){
    clearTimeout ( backupTimeoutID );
    backupTimeoutID = setTimeout(function(){sendDivContentToServer()},3000);
}
} else if ( pressedKeyCode==13 ) {
    e.preventDefault();
    document.execCommand("InsertHTML",false,"a"); // this works
    document.execCommand("InsertHTML",false,"<br>"); // I don't see the effects I want with this
}
<script>

转换多个换行符——&lt;div&gt;&lt;p&gt;&lt;br&gt;——似乎是一项艰巨的任务。使用&lt;br&gt; 换行似乎不太容易出错。

我正在为 FileMaker 中的 Web 查看器进行开发,以便在 Mac OSX 中使用。所以,到目前为止,我比任何其他浏览器都更关心 Safari。

提前感谢您的帮助。

【问题讨论】:

  • Command list 中查看insertBrOnReturn
  • 另一种方法是让它们保持原样并使用已经实现的解析器将它们解析为字符串...您所做的是在浏览器上进行部分解析,在服务器上进行部分解析...如果没有充分的理由,请不要使用解析。
  • @teemu 不工作。我读到insertBrOnReturn 是 Mozilla 特有的。
  • 确实,我也应该把那页读到最后。
  • @Sachin 有可能;问题是 FileMaker 没有一个好的解析器(我知道)。到目前为止,我几乎都是自己制作了解析器,而且,除其他问题外,解析时间太长。如果我可以在浏览器中更好地组织它,那么在服务器中会更好。

标签: javascript html css line-breaks


【解决方案1】:

控制contentEditable 并非易事。不幸的是,它并没有真正标准化,每个浏览器都有其怪癖。

我建议您看看周围许多编写良好的 HTML 富文本编辑器。

例如,CKEditor 只创建合理、有效的 HTML,它允许您配置 what happens, when the user presses return,它可以配置 remove or replace any unwanted HTML,并且您可以禁用任何用户不应该使用的功能。

【讨论】:

  • 我不是 javascript 和 html 的高手。您是否认为与该编辑合作以使其按我的需要工作需要这些主题的专业知识吗?我更偏向于菜鸟。
  • 使用 CKEditor 肯定比自己扩展contentEditable 需要更少的专业知识,而且 CKEditor 有很好的文档,但我很难判断它对于初学者来说是可以理解的。您可以尝试打开一个新问题,描述您对contentEditable 的具体操作,尤其是您(或用户?)为什么以及如何设置背景颜色。我相信有人可以帮助您配置 CKEditor 或找到更好/更简单的方法来实现您想要做的事情。
  • 非常感谢您的帮助。如果我找不到其他方法,我可能会这样做。需要背景色;用户非常具体,他希望能够“用各种颜色突出显示”并再次编辑文本。
  • 这是要走的路。 CKEditor 太棒了!谢谢!