Предположительно, вы собираетесь публиковать редактируемый контент обратно на сервер. Поэтому вам не должно быть важно, есть ли у вас теги абзаца или разрыва, когда пользователь редактирует, потому что вы можете анализировать HTML перед отправкой (или, если хотите, на сервере) и заменять экземпляры абзацев на разрывы. Это сохраняет очередь UNDO в действии для пользователя, но позволяет вам иметь ваш HTML настолько чистым, насколько вы этого хотите.
Далее я предполагаю, что вы точно будете знать, какие элементы DIV будут contentEditable. Перед отправкой формы вы можете запустить каждый div contentEditable с помощью такой функции:
function cleanContentEditableDiv(div) {
var htmlString = div.innerHTML;
htmlString = htmlString.replace(/<\/p>/gim,"<br/>");
htmlString = htmlString.replace(/<p>/gim,"");
return htmlString;
}
И вы вызываете это в цикле (который перебирает все DIVs ContentEditable, используя массив, который я буду называть 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 вставляет не [пробел] [пробел], а [пробел] & nbsp ;, начальный пробел (String.fromCharCode (32)) плюс столько же & NBSP; объекты, как осталось в космическом пробеге.