Google が Google+ ユーザーのタグ付けで contenteditable div をどのように使用しているかを分析した後、私ははるかに合理的な解決策にたどり着きました。多分それは他の誰かを助けるでしょう。
1 つのタグを追加した後、既に html ブラウザーからブラウザーへの多くの違いを確認できます。
Google Chrome では、各タグにスペースが追加されます。ボタンタグを使用しています。そして、クロムのみの contenteditable="plaintext-only" が使用されます。
クロムでスペースをバックスペースすると、BR タグが追加されます。
Firefox では、BR タグは最初のタグとともにすぐに追加されます。スペースは必要ありません。また、button タグの代わりに input タグが使用されます。
BR タグは、これを掘り下げているときに私が経験した最大の突破口でした。これを追加する前は、タグの削除やフォーカスの問題に関する多くの奇妙な動作がありました。
IE では、さらに興味深い変更が加えられました。ここでは、タグに contenteditable false のスパンが使用されています。スペースや BR タグはありませんが、空のテキスト ノードです。
以上のことから、Google を正確にコピーする必要はありません。
重要な部分:
HTML をレンダリングしている場合は、次の手順を実行します...
1. Chrome はボタンタグを使用する必要があります
2. Firefox/IE は input タグを使用する必要があります
範囲/選択では、通常、タグなどを単一の文字として扱いたいと考えています。これを範囲/選択ロジックに組み込むことができますが、入力/ボタン タグの動作ははるかに一貫性があり、コードがはるかに少なくなります。
IE は、スパンを使用して IE7-8 でより適切に動作します。ただUIの観点から。しかし、古いバージョンの IE でサイトがきれいかどうか気にしない場合、入力は IE でも Firefox でも正しく動作します。
3. Chrome のみ。編集可能な div で contenteditable="plaintext-only" 属性を使用します。
そうしないと、ユーザーがリッチテキストを貼り付けようとしたときだけでなく、html 要素を削除するときにも、スタイルが div に転送されることがあります。これに関する多くの奇妙な問題に気付きました。
4. キャレット位置を div の最後に設定する必要がある場合は、BR の前に範囲の最後を設定します。
ファイアフォックスの場合:
range.setEndBefore($(el).find('br')[0]);