Contenteditable Div - 根据 innerHTML 位置的光标位置
Contenteditable Div - Cursor position in terms of innerHTML position
我已经完成了我的研究并在 Whosebug 上遇到了这些问题,人们问了同样的问题,但问题是他们想要根据 x 和 y 坐标或从左边开始的列来获得位置。我想知道光标相对于 div 的 innerHTML 的位置。
例如:
innerHTML = "This is the innerHTML of the <b>div</b> and bla bla bla..."
^
Cursor is here
所以这个案例我想要的结果是44。怎么做?
var target = document.createTextNode("\u0001");
document.getSelection().getRangeAt(0).insertNode(target);
var position = contentEditableDiv.innerHTML.indexOf("\u0001");
target.parentNode.removeChild(target);
这会临时插入一个包含不可打印字符 (\u0001
) 的虚拟文本节点,然后在 div
的 innerHTML
中找到该字符的索引。
在大多数情况下,这会使 DOM 和当前选择保持不变,但可能会产生一个较小的副作用:如果光标位于单个文本节点的文本中间,则该节点将被破坏最多分为两个连续的文本节点。通常这应该是无害的,但在您的特定应用程序的上下文中请记住它。
更新: 结果表明您可以使用 Node.normalize()
.
合并连续的文本节点
我已经完成了我的研究并在 Whosebug 上遇到了这些问题,人们问了同样的问题,但问题是他们想要根据 x 和 y 坐标或从左边开始的列来获得位置。我想知道光标相对于 div 的 innerHTML 的位置。
例如:
innerHTML = "This is the innerHTML of the <b>div</b> and bla bla bla..."
^
Cursor is here
所以这个案例我想要的结果是44。怎么做?
var target = document.createTextNode("\u0001");
document.getSelection().getRangeAt(0).insertNode(target);
var position = contentEditableDiv.innerHTML.indexOf("\u0001");
target.parentNode.removeChild(target);
这会临时插入一个包含不可打印字符 (\u0001
) 的虚拟文本节点,然后在 div
的 innerHTML
中找到该字符的索引。
在大多数情况下,这会使 DOM 和当前选择保持不变,但可能会产生一个较小的副作用:如果光标位于单个文本节点的文本中间,则该节点将被破坏最多分为两个连续的文本节点。通常这应该是无害的,但在您的特定应用程序的上下文中请记住它。
更新: 结果表明您可以使用 Node.normalize()
.