对于那些没有使用过 Google Docs 编辑器的人,这里简要解释一下它的工作原理:
- Google Docs 没有可见的可编辑 textarea 或 contentEditable 元素。
- Google Docs 在单独的 iFrame 中侦听 keydown/press/up,它们将 OS 光标放置在其中以进行事件侦听。
- 当 iFrame 捕获事件时,Google 通过对可见文档执行等效操作来处理它。
- Google Docs 中的“插入符号”是一个 DIV,其样式和脚本看起来和行为都像 OS 光标。
顺便说一句,这是我的要求:
我正在开发一个与 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>