【问题标题】:How to implement break lines and paragraphs on contenteditable?如何在 contenteditable 上实现换行和段落?
【发布时间】:2013-12-03 15:26:38
【问题描述】:

我正在为 Safari 构建一个简单的文本编辑器。我需要实现一个非常具体的行为:

首先进入 - 创建<br>标签

第二次输入(<br> 之后)- 创建新段落

我已经在监听输入按键事件并使用 formatBlock 来格式化段落。如何检查插入符号之前的元素是否是 <br> 元素,以便我可以使用 formatBlock?

默认情况下,Safari 在 enter 按键上添加了<div><br></div>,所以我也需要使用 preventDefault 进行第一次输入。 (上面的代码)

我使用以下方法创建新段落:

$("#content").live("keypress", function(e){
    if (e.which == 13) {
        document.execCommand("formatBlock", false, "p"); 
    }
});

我可以添加 br 使用:(Make a <br> instead of <div></div> by pressing Enter on a contenteditable)

if (window.getSelection) {          
    var selection = window.getSelection(),              
        range = selection.getRangeAt(0),              
        br = document.createElement("br");          
    range.deleteContents();          
    range.insertNode(br);
    range.setStartAfter(br);
    range.setEndAfter(br);
    range.collapse(false);
    selection.removeAllRanges();
    selection.addRange(range);
    return false; 
}

更新: 用户正在键入这样的段落:&lt;p&gt;This is my paragraph&lt;/p&gt;。在输入键时,代码应为&lt;p&gt;This is my paragraph&lt;br&gt;&lt;/p&gt;(br 后的光标)。第二次按回车应该会出现在&lt;p&gt;This is my paragraph&lt;/p&gt;&lt;p&gt;&lt;/p&gt;(第二段上的光标)

【问题讨论】:

  • 你需要代码来获取插入符号之前的字符吗?
  • 检查插入符号之前的元素是否为&lt;br&gt;
  • 请参阅下面我的答案中的代码。如果您希望我添加解释,请告诉我。

标签: javascript jquery html contenteditable


【解决方案1】:

您可以使用keydown,例如:

<div id="textarea"></div>

然后在你的脚本文件中:

document.getElementById("textarea").addEventListener("keydown",function(e){if(e.keyCode == 32) {ocument.getElementById("textarea").innerHTML+="<br />"} })

还有你的其他东西

【讨论】:

  • 这段代码总是在 textarea 的末尾插入 br。如果用户光标位于文本的开头或中间怎么办?另外,如何检查前一个元素是否为 br,以便创建新段落?
【解决方案2】:

免责声明:仅在 Chromium 上进行测试。

var sel = window.getSelection();
var range = sel.getRangeAt(0);
if ((sel.extentNode.previousElementSibling instanceof HTMLBRElement)
     && range.startOffset == 0)
{
     // Do your magic to start a paragraph.
} else {
     // Your existing code to add a <br> element since there is no <br> before it.
}

【讨论】:

  • 它不起作用 :( previousElementSibling 对我来说是 DOMHTMLHeadElement。我认为这不会发生,因为我的 contenteditable 元素是 BODY
  • 所以,如果previousElementSibling是DOMHTMLHeadElement,说明你还没有插入
    节点,应该进入else子句插入。插入后,它将成为当前文本节点的前一个元素。再次点击回车会给你 HTMLBRElement 作为前一个节点。
  • This is a test&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;After break line&lt;br&gt;&lt;br&gt;&lt;br&gt; 这是 内的 html 和光标位置 - rangeStart: 15 rangeEnd: 15
  • 您在哪个浏览器中测试,当开始和结束报告为 15 时插入符号在哪里?
  • 我在这里用你的原始代码创建了一个小提琴:jsfiddle.net/DQHKc。当用户按下回车键时,您正在

    节点内创建一个
    节点。我认为这也弄乱了后面的代码。

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2015-05-22
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多