ユーザーがその中のテキストを更新できるようにするために、div でブラウザーの contenteditable=true を使用すると、(Chrome を使用して) この問題が発生します。
削除バックスペース キーを使用して改行を削除する (1 行上にジャンプする) 場合、ブラウザはそのテキストの周りにインライン スタイル セットのタグを挿入します。
それを行うだけでなく、そのスパンタグにインラインスタイルを追加するため、これは本当にイライラします。たとえば、フォントの色が現在黒の場合、そのスパンタグに style="color:black" を追加します。
その結果、インライン スタイルによってスパン タグに強く設定されているため、ツールバーでそのテキストの色を編集できなくなりました。これと同じことを削除キーで行をバックアップすると、フォントサイズでも同じことが起こります。
contenteditable について 1 つまたは 2 つのことを教えてくれる人、またはこのブラウザーの動作を防ぐことができない場合は、スパンを削除する方法を提案できる人..
** この問題を再現するには ** - ブラウザで div を作成し、たとえば font-size:36px でインライン スタイルを設定します - ブラウザで編集可能なコンテンツで div のテキストを編集し、手動で改行して数行を書き込みます。- テキストの段落の前 / 前にカーソルを置き、バックスペースを押します。カーソルの前にあるテキストの周りに span タグが生成され、スタイルが変更されます。
更新* * だから私はいくつかの異なる解決策を試しましたが、成功は限られていました。最初にすべてのタグを削除しようとしましたが、すべての改行も失いました (より良い正規表現でこれを解決できる可能性があります。私は正規表現の作成の専門家ではありません)。
以下のすべての関数は、最初にキーアップ イベントで呼び出されましたが、その後、テキスト ボックスの選択を解除するためにそれらをアタッチしました。以下の関数を起動する方法は、質問とは無関係です。
//option to remove all tags
var withTags = $(textObject).html();
var withoutTags = withTags.replace(/<(?:.|\n)*?>/gm, '');
$(textObject).html(withoutTags);
私の2回目の試みは、テキストボックスの下にあるオブジェクトのスタイルタグを削除することでより成功しました(クロムが追加したテキストボックス内のdivとスパン)。これが私の最初のコードです
//option to remove style of elements
$(textObject).children().each(function() {
$(this).removeAttr('style');
console.log('removing style from first level element: '+this);
});
次に、テキストボックスを編集するたびに、chrome が上記のコードでは届かない新しいネストされたレベルの div/span タグを追加する可能性があることに気付いたので、次のようにしました。
//option to remove style of elements
$(textObject).children().each(function() {
$(this).removeAttr('style');
console.log('removing style from first level element: '+this);
//And of course it would be all too easy if chrome added only one level of elements...
$(this).children().each(function() {
$(this).removeAttr('style');
console.log('removing style from second level element: '+this);
});
});
しかし、ネストの量は理論的には無制限になる可能性があるため、それだけでは十分ではありません。まだより良い解決策に取り組んでいます。どんな入力でも大歓迎です =)