Contenteditable divには多くの問題があり、編集可能なdiv内のhtmlやコンテンツ以外の編集可能なコンテンツを削除しています。
ここで優れたTim Downの回答を使用する: contentEditable属性を持つdiv内のHTML要素を削除する方法
Timのコードを使用すると、テキストノード全体が削除されます。これは、textareaと同じように機能するために必要です。1文字ずつ削除し、html要素もバックスペースできるようにします。
私は以下を試しました
else if(node){
var index = node.length-1;
if(index >= 0)
node.deleteData(index,1);
else
this.removeChild(node);
}
しかし、これは明らかに正しく機能しません。コンテンツの最後にいる場合、期待どおりに機能します。しかし、カーソルを他の場所に置いても、最後から削除されます。
私はこの時点で迷っています、どんな助けでも大歓迎です
グーグルがグーグルプラスユーザーのタグ付けでコンテンツ編集可能なdivをどのように使用するかを分析した後、私ははるかに合理的な解決策を見つけました。多分それは他の誰かを助けるでしょう。
1つのタグを追加した後、HTMLブラウザーごとに多くの違いを確認できます。
Google Chromeでは、タグごとにスペースが追加されます。ボタンタグが使用されます。そして、chrome-only contenteditable = "plaintext-only"が使用されます。
クロムでスペースをバックスペースすると、BRタグが追加されます。
Firefoxでは、BRタグは最初のタグとともにすぐに追加されます。スペースは必要ありません。そして、ボタンタグの代わりに入力タグが使用されます。
BRタグは、これを掘り下げていたときに私が持っていた最も優れたブレークスルーの1つでした。これを追加する前は、フォーカスの問題だけでなく、タグの削除に関して多くの風変わりな動作がありました。
IEでは、さらに興味深い変更が行われました。ここでは、タグにcontenteditable falseのスパンが使用されています。スペースやBRタグはありませんが、空のテキストノードです。
以上のことから、Googleを正確にコピーする必要はありません。
重要な部分:
HTMLをレンダリングする場合は、次のようにします...
1。Chrome buttonタグを使用する必要があります
2。Firefox/IEはinputタグを使用する必要があります
通常、範囲/選択では、タグなどを1つの文字として扱います。これを範囲/選択ロジックに組み込むことができますが、入力/ボタンタグの動作ははるかに一貫しており、コードが少なくなります。
IEはスパンを使用してIE7-8でより適切に動作します。ちょうどUIの観点から。しかし、サイトが古いバージョンのIEで問題ないかどうかを気にしない場合、入力はIEとfirefox。で正しく動作します。
。Chromeのみ、編集可能なdivでcontenteditable = "plaintext-only"属性を使用します。
それ以外の場合、ユーザーがリッチテキストを貼り付けようとするときだけでなく、html要素を削除するときにスタイルがdivに転送されることがありますが、多くの奇妙な問題が発生しましたこれで
4。キャレット位置をdivの終わりに設定する必要がある場合は、BRの前に範囲の終わりを設定します。
fireFoxの場合:
range.setEndBefore($(el).find('br')[0]);