Для тех, кто не работал с редактором Google Docs, вот краткое объяснение того, как он работает:
- Документы Google не имеют видимых редактируемых элементов textarea или contentEditable.
- Google Docs прослушивает нажатие/нажатие клавиши/вверх в отдельном iFrame, куда они помещают курсор ОС для прослушивания событий.
- Когда iFrame перехватывает событие, Google обрабатывает его, выполняя аналогичные операции с видимым документом.
- «Каретка» в Google Docs — это DIV, который оформлен и написан таким образом, чтобы выглядеть и действовать как курсор ОС.
С этим из пути, вот моя просьба:
Я работаю над плагином, который взаимодействует с Google Doc, и мне нужно иметь возможность делать две вещи:
- Выделите слова непрозрачным наложением DIV.
- Определить положение курсора внутри слова.
Я исчерпал множество идей о том, как с этим справиться, но пока мне удалось найти решение с ошибками только для последней проблемы (я выполняю возврат, определяю, где изменился текст, и отменяю возврат).
Я ищу все лучшие идеи, которые вы можете придумать, чтобы решить эти проблемы. Они не должны быть кросс-браузерными, но их нужно превратить во что-то надежное, что также будет обрабатывать такие вещи, как изменение размера шрифта в средней строке.
Немного дополнительной информации, объясняющей, как выглядит Google Doc в 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>