これが私が達成しようとしていることです: ユーザーがマウス、キーボード、またはタッチを使用して「myDiv」内のテキストを選択する場合、HTML の 3 つの目立たないチャンクを取得したい: 選択前の HTML (その「左」) )、選択範囲内の HTML、および選択範囲の後の HTML (その「右側」)。html は、myDiv.innerHTML で表示されるようにする必要があります。
選択は、タグ ペア内で開始または終了する場合があります (つまり、分離された選択は、必ずしも有効な HTML であるとは限りません)。選択範囲内の絶対位置要素のような特別なシナリオを扱う必要はありません。私が関心を持っているすべての選択は、strong、em、ul、ol、h1、image、および table などの基本的なタグを含む 1 つの div に制限されます。
最も近いのは、rangyを使用して選択範囲を引っ掛け、呼び出しselection.getRangeAt(0).cloneContents()
て選択範囲の HTML を取得することです。これは、単独では無効な選択を行うまでは十分に機能し、ブラウザーはドキュメントフラグメントの HTML を変更して有効なマークアップにします。
追加情報:これが必要な理由は次のとおりです。
ドキュメント フィードバック システムを作成しているので、後で検索して再構成できるように、選択情報をデータベースに保存する必要があります。通常、DOM パスと選択したテキストを使用して選択内容を保存しますが、保存と再構成の間でテキストが変わる場合があります。たとえば、作成者は段落全体を移動したり、セクションを削除したりする場合があります。その場合、DOM パスはほとんど役に立たなくなります。
したがって、私の (不完全な) 計画は、選択範囲を [offset, length, html_snippet] として保存することです。それが「ポジション」です。また、選択したテキストの直前と直後にある HTML スニペットも保存します。これが「文脈」です。
これらのデータを組み合わせて使用すると、最初に選択したテキストが移動したり部分的に変更されたりした場合でも、ほとんどの場合、そのテキストを再配置できるはずです。それが失敗した場合、UI には対処する方法がありますが、できるだけ頻繁に発生しないようにしたいと考えています。
ありがとうございます!