Для тех, кто не работал с редактором Google Docs здесь краткое объяснение того, как это работает:Как измерить положение слова/каретки в Документах Google?
- Google Docs не имеет видимых редактируемой или текстовое поле contentEditable элементов.
- Документы Google прослушивают keydown/press/up в отдельном iFrame, где они размещают курсор OS для прослушивания событий.
- Когда iFrame ловит событие, которое Google обрабатывает, выполняя эквивалентные операции над видимым документом.
- «Карет» в Документах Google - это DIV, который оформлен и написан сценарием, чтобы выглядеть и действовать как курсор ОС.
С этим из пути, вот мой запрос:
Я работаю на плагин, который взаимодействует с Google Doc, и мне нужно, чтобы быть в состоянии сделать две вещи:
- Выделите слова с непрозрачным наложением DIV.
- Определить позицию курсора внутри слова.
Я исчерпываю много идей о том, как с этим справиться, но до сих пор мне удавалось получить только багги-решение для последней проблемы (я выполняю обратное пространство, определяю, где текст был изменен и отменить backspace).
Я ищу все лучшие идеи, которые вы можете решить, чтобы решить эти проблемы. Им не нужно быть перекрестным браузером, но они должны быть способны превратиться во что-то надежное, которое также будет обрабатывать такие вещи, как размер шрифта, измененный в середине строки.
Немного дополнительной информации, объясняющей, что выглядит 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>
Не уверен, что я следую тому, что вы подразумеваете под заменой 'textNode', но после моего ответа я обновил свой код, чтобы сделать что-то похожее на вас, что вы предлагаете. В отличие от изменения любого HTML, я создаю объект «Range» и манипулирую стартовым и конечным узлами, пока 'Range.getBoundingClientRect()' не сможет указать мне, где находится курсор, сравнивая с 'cursor.getBoundingClientRect()'. – Woodgnome