私はこのHTMLコードを持っています(contenteditable="true"
ブロックにあります):
<ol>
<li>Mozilla Firefox 1.5+</li>
<li>Internet <span>Explorer</span> 6+</li>
<li>Opera 9.6+</li>
<li>Google Chrome 2+</li>
<li>Apple Safari 3+</li>
</ol>
ユーザーがこのリストでいくつかのテキストを選択しました:
- まさに「クロム」という言葉、
- または正確に«Explorer»という単語(
span
タグでラップされています)。
«Chrome» と «Explorer» という単語の主な違いは、«Explorer» という単語はspan
タグでラップされているが、«Chrome» はタグでラップされていないことです。
では、選択したテキストが HTML タグでラップされているかどうかはどうすればわかりますか?
- いくつかの正規表現で?— HTML タグで選択したテキストを取得する方法がわかりません (選択範囲からプレーン テキストを取得する方法しか知りません)。
- 検出範囲の
commonAncestorContainer.parentNode
?— 単語 «Chrome» を選択した場合、タグにparentNode
なりますli
(ただし、li
タグは選択した単語を直接ラップしません。タグのスタイルを設定したくありませんli
)。だから、私commonAncestorContainer.parentNode
には役に立たないので使えません。
実際には、選択したテキストにいくつかの CSS スタイルを設定したいだけです。
- ユーザーが選択したテキストが既に何らかの HTML タグで直接ラップされている場合、このタグに CSS ルールを追加したい (例: ユーザーが «Explorer» という単語を選択した場合
style="font-weight:bold;"
、span
タグに追加したい; ユーザーが選択した場合Apple Safari 3+
、CSS を追加したい)li
タグのルール) - ユーザーが選択したテキストが単なるプレーン テキスト (単語 «Chrome» などのタグで直接ラップされていない) である場合、このテキストをいくつかのタグでラップし、いくつかの CSS ルールを追加したいと考えています。(このアイテムで問題はありません。これを行う方法を知っています。)
UPD:
ほら、テキストを選択して実行すると、ブラウザが選択範囲をタグdocument.execCommand('Bold', false, null)
でラップします。b
まったく同じテキストをもう一度選択して同じdocument.execCommand('Bold', false, null)
コマンドを実行すると、太字が消えます。そのため、ブラウザは、私の選択がb
タグでラップされていることを何らかの方法で認識し、それらを削除します(アンラップ)。ブラウザは、選択範囲がタグでラップされているかどうかをどのように認識しますか? ブラウザが知っているなら、なぜJSで作るのが難しいのですか?