Google ドキュメント エディタを使用したことがない人のために、その仕組みを簡単に説明します。
- Google ドキュメントには、目に見える編集可能なテキストエリアや contentEditable 要素はありません。
- Google ドキュメントは、イベントをリッスンするための OS カーソルを配置する別の iFrame でキーダウン/プレス/アップをリッスンします。
- iFrame がイベントをキャッチすると、Google は表示されているドキュメントに対して同等の操作を実行してイベントを処理します。
- Google ドキュメントの「キャレット」は、OS カーソルのように見えて動作するようにスタイルとスクリプトが作成された DIV です。
それが邪魔にならないように、ここに私の要求があります:
Google Doc とやり取りするプラグインに取り組んでおり、次の 2 つのことを実行できる必要があります。
- 不透明なオーバーレイ DIV で単語を強調表示します。
- 単語内のカーソル位置を決定します。
これを処理する方法について多くのアイデアを使い果たしてきましたが、これまでのところ、後者の問題のバグのある解決策しか得られませんでした (バックスペースを実行し、テキストが変更された場所を特定し、バックスペースを元に戻します)。
これらの問題を解決するために思いつくことができる最高のアイデアをすべて探しています。それらはクロスブラウザである必要はありませんが、行の途中でフォントサイズが変更されるなどのことも処理できる堅牢なものに変換できる必要があります。
Google ドキュメントが HTML でどのように表示されるかを説明する追加情報:
<wrapper> // Simplified wrapper containing margins, pagination and similar
<div class="kix-paragraphrenderer"> // single DIV per page wrapping all content
// Multiple paragraphs separated by linebreak created by Enter key:
<div class="kix-paragraphrendeder">...</div>
<div class="kix-paragraphrendeder">...</div>
<div class="kix-paragraphrendeder">
// Multiple wrapper divs created by Google's word wrapping:
<div class="kix-lineview">...</div>
<div class="kix-lineview">...</div>
<div class="kix-lineview">
// Single inner wrapper, still full width of first wrapper paragraph:
<div class="kix-lineview-content">
// Single wrapper SPAN containing full text of the line, but not display:block
<span class="kix-lineview-text-block">
// Multiple spans, one per new font change such as normal/bold text,
// change in font size, indentation and similar:
<span>This is normal text</span>
<span style="font-size:40px; padding-left:4px;">This larger text.</span>
<span style="font-weight:bold; padding-left:10px;">This is bold text</span>
<span style="padding-left:4px;">More normal text</span>
</span>
</div>
</div>
</div>
</div>
</wrapper>