おそらく、編集可能なコンテンツをサーバーにポストすることになるでしょう。したがって、ユーザーが編集している間に段落タグや区切りタグが配置されているかどうかを実際に気にする必要はありません。送信前に (または必要に応じてサーバー上で) 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;
}
そして、これをループで呼び出します (これは、ceDiv と呼ぶ配列を使用して、すべての contentEditable DIV を反復処理します)、次のようにします。
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 によって挿入されるのは [スペース][スペース] ではなく [スペース] 、最初のスペース文字 (String.fromCharCode(32)) と同じ数のスペースです。 スペースランに残っている実体。