大概您要将可编辑的内容发布回服务器。因此,您不应该真正关心用户编辑时是否有段落或中断标记,因为您可以在提交之前(或在服务器上,如果您愿意)解析 HTML 并用中断替换段落实例。这可以让 UNDO 队列为用户运行,但可以让您的 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;
}
然后你在一个循环中调用它(它遍历所有 contentEditable DIV,使用我将称为 ceDivs 的数组),如下所示:
ceDivs[i].contentEditable = false; // to make sure IE doesn't try to coerce the contents again
进而:
ceDivs[i].innerHTML = cleanContentEditableDiv(ceDivs[i]);
对此的改进(特别是如果您不想在提交时正确执行此操作),可能是在您喜欢的任何其他时间(onblur,等等)清理每个此类 div 的内容并将每个 ceDiv 的内容分配给它自己的不可见表单元素供以后提交。与您自己的 CSS 建议结合使用,这可能对您有用。它不会保留您对字母的字面要求(即,它不会让 Javascript 使 IE 的行为与在幕后编码的行为不同),但对于所有实际目的,效果是相同的。用户得到他们想要的,你得到你想要的。
当您使用它时,您可能还想清除 IE 中的空格字符串。如果用户键入多个空格(有些人仍然在句点后这样做),IE 插入的不是 [space][space] 而是 [space] ,一个初始空格字符 (String.fromCharCode(32)) 加上尽可能多的空格 空间运行中留下的实体。