假设您要将可编辑的内容发布到服务器。因此,在用户编辑时,您不应该真正关心是否有段落或换行符标记,因为您可以在提交之前(或者如果您喜欢,在服务器上)解析HTML并用换行符替换段落的实例。这使得UNDO队列对用户保持有效,但是让您的HTML尽可能干净。
我进一步假设您将确切地知道哪些DIV元素将成为contentEditable。在提交表单之前,您可以将每个可编辑的div运行通过以下函数:
function cleanContentEditableDiv(div) {
var htmlString = div.innerHTML;
htmlString = htmlString.replace(/<\/p>/gim,"<br/>");
htmlString = htmlString.replace(/<p>/gim,"");
return htmlString;
}
你需要在循环中调用这个函数(遍历所有可编辑的DIV,使用一个名为ceDivs的数组),像这样:
ceDivs[i].contentEditable = false; // to make sure IE doesn't try to coerce the contents again
然后:
ceDivs[i].innerHTML = cleanContentEditableDiv(ceDivs[i])
如果你不想在提交时进行操作的话,对此进行改进(特别是这个情况),可能是在任何其他时间清理每个这样的div的内容(例如onblur),并将每个ceDiv的内容分配给它自己的隐藏表单元素以供稍后提交。结合上面提到的CSS建议使用,这可能适合你。它没有严格保留你的要求(即,它没有让Javascript使IE的行为与其编码下的行为有所不同),但实际效果相同。用户得到了他们想要的,你也得到了你想要的。
在此期间,您还可以清理IE中的空格字符串。如果用户键入多个空格(如某些人在句号后仍然这样做),则IE插入的不是[space][space],而是[space] ,一个初始空格字符(String.fromCharCode(32))加上与空格运行中剩余数量相同的 实体。