在Internet Explorer上,Firefox会在您每次按Enter键时创建一个新段落(<p></p>),而contentEditable会创建一个<br/>标记。
正如前面讨论的here,可以使用JavaScript截取输入keyPress,然后使用range.pasteHTML创建<br/>。但这样做会破坏撤消菜单;一旦您按下Enter,就不能再撤消超过该点的操作。
如何在不中断撤消的情况下强制contentEditable元素在回车时创建单行换行?
发布于 2010-02-16 22:52:08
当你按回车键时按住shift键进行中断,不要在整个段落中按住shift键。默认情况下,这一行为在Firefox中是相同的,给定一个包含段落的可内容编辑区域:即
<div contenteditable="true">
<p>If you are typing here</p>
<div>发布于 2010-02-16 21:53:30
假设您要将可编辑的内容发送回服务器。因此,您不应该真正关心在用户编辑时是否有段落或分隔符标记,因为您可以在提交之前(如果愿意,也可以在服务器上)解析HTML,并用分隔符替换段落的实例。这将使用户的撤消队列处于运行状态,但可以让您的HTML如您所希望的那样干净。
我将进一步假设您将确切地知道哪些DIV元素将是contentEditable。在提交表单之前,您可以通过如下函数运行每个contentEditable div:
function cleanContentEditableDiv(div) {
var htmlString = div.innerHTML;
htmlString = htmlString.replace(/<\/p>/gim,"<br/>");
htmlString = htmlString.replace(/<p>/gim,"");
return htmlString;
}您可以在一个循环中调用它(它使用一个我将调用ceDivs的数组迭代所有contentEditable DIVs ),如下所示:
ceDivs[i].contentEditable = false; // to make sure IE doesn't try to coerce the contents again然后:
ceDivs[i].innerHTML = cleanContentEditableDiv(ceDivs[i]);对此的一个改进(特别是如果您不想在提交时执行此操作),可能是在任何其他时间(onblur,随便)清除每个此类ceDiv的内容,并将每个div的内容分配给它自己的不可见表单元素,以便稍后提交。与上面你自己的CSS建议结合使用,这可能对你有用。它不会保留字面上的要求(即,它不会让Javascript使IE的行为与其在幕后编码的行为不同),但对于所有实际目的,效果都是相同的。用户得到他们想要的,你得到你想要的。
当你这样做的时候,你可能也想在IE中清理空格字符串。如果用户键入多个空格(就像一些人在句点之后仍在做的那样),IE插入的不是空格,而是空格,一个初始空格字符(String.fromCharCode(32))加上与空格运行中剩余的一样多的空格实体。
发布于 2011-07-27 21:02:52
使用<BR>而不是<P> (在IE9中测试。可能在<BR> (pasteHTML("<br> "))之后的旧版本中需要nbsp; )
在keydown事件中使用它:
if (e.keyCode == 13) {
var range = document.selection.createRange();
range.pasteHTML("<br> ");
range.moveStart("character", 0);
range.moveEnd("character", -1);
range.select();
return false;
}https://stackoverflow.com/questions/2220939
复制相似问题