首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >强制IE contentEditable元素在Enter键上创建换行符,而不中断撤消

强制IE contentEditable元素在Enter键上创建换行符,而不中断撤消
EN

Stack Overflow用户
提问于 2010-02-08 18:38:54
回答 5查看 14.2K关注 0票数 29

在Internet Explorer上,Firefox会在您每次按Enter键时创建一个新段落(<p></p>),而contentEditable会创建一个<br/>标记。

正如前面讨论的here,可以使用JavaScript截取输入keyPress,然后使用range.pasteHTML创建<br/>。但这样做会破坏撤消菜单;一旦您按下Enter,就不能再撤消超过该点的操作。

如何在不中断撤消的情况下强制contentEditable元素在回车时创建单行换行?

EN

回答 5

Stack Overflow用户

发布于 2010-02-16 22:52:08

当你按回车键时按住shift键进行中断,不要在整个段落中按住shift键。默认情况下,这一行为在Firefox中是相同的,给定一个包含段落的可内容编辑区域:即

代码语言:javascript
运行
复制
<div contenteditable="true">
    <p>If you are typing here</p>
<div>
票数 5
EN

Stack Overflow用户

发布于 2010-02-16 21:53:30

假设您要将可编辑的内容发送回服务器。因此,您不应该真正关心在用户编辑时是否有段落或分隔符标记,因为您可以在提交之前(如果愿意,也可以在服务器上)解析HTML,并用分隔符替换段落的实例。这将使用户的撤消队列处于运行状态,但可以让您的HTML如您所希望的那样干净。

我将进一步假设您将确切地知道哪些DIV元素将是contentEditable。在提交表单之前,您可以通过如下函数运行每个contentEditable div:

代码语言:javascript
运行
复制
function cleanContentEditableDiv(div) {
  var htmlString = div.innerHTML;
  htmlString     = htmlString.replace(/<\/p>/gim,"<br/>");
  htmlString     = htmlString.replace(/<p>/gim,"");
  return htmlString;
}

您可以在一个循环中调用它(它使用一个我将调用ceDivs的数组迭代所有contentEditable DIVs ),如下所示:

代码语言:javascript
运行
复制
ceDivs[i].contentEditable = false; // to make sure IE doesn't try to coerce the contents again

然后:

代码语言:javascript
运行
复制
ceDivs[i].innerHTML = cleanContentEditableDiv(ceDivs[i]);

对此的一个改进(特别是如果您不想在提交时执行此操作),可能是在任何其他时间(onblur,随便)清除每个此类ceDiv的内容,并将每个div的内容分配给它自己的不可见表单元素,以便稍后提交。与上面你自己的CSS建议结合使用,这可能对你有用。它不会保留字面上的要求(即,它不会让Javascript使IE的行为与其在幕后编码的行为不同),但对于所有实际目的,效果都是相同的。用户得到他们想要的,你得到你想要的。

当你这样做的时候,你可能也想在IE中清理空格字符串。如果用户键入多个空格(就像一些人在句点之后仍在做的那样),IE插入的不是空格,而是空格,一个初始空格字符(String.fromCharCode(32))加上与空格运行中剩余的一样多的空格实体。

票数 4
EN

Stack Overflow用户

发布于 2011-07-27 21:02:52

使用<BR>而不是<P> (在IE9中测试。可能在<BR> (pasteHTML("<br>&nbsp;"))之后的旧版本中需要nbsp; )

在keydown事件中使用它:

代码语言:javascript
运行
复制
if (e.keyCode == 13) {
 var range = document.selection.createRange();
 range.pasteHTML("<br> ");
 range.moveStart("character", 0);
 range.moveEnd("character", -1);
 range.select();
 return false;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2220939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档