我使用以下代码来选择元素
const selectEnd = (element: HTMLElement, position: number) => {
element.focus();
const range = document.createRange();
const sel = window.getSelection();
if (position !== -1) {
range.setStart(element, Math.min(position, element.childNodes.length));
} else {
range.setStart(element, element.childNodes.length);
}
sel?.removeAllRanges();
sel?.addRange(range);
};
选择元素后,以下rect变量将始终处于未定义状态
const selection = window.getSelection();
if (!selection) return;
const range = selection.getRangeAt(0).cloneRange();
range.collapse(true);
const rect = range.getClientRects()[0];
但是在客户端发生onInput事件之后,range.getClientRects函数将返回一个值。
我尝试让range.getClientRects()在focus调用后返回一个变量,而不需要用户输入任何内容。
1条答案
按热度按时间ghg1uchk1#
你在CSSWG#2514上感觉到了。
问题是浏览器无法计算出
DOMRects
组成的折叠Range
锚定到Element
(而不是Node
)。本文CKEditor issue列出了可能发生这种情况的几种情况,以及一些潜在的解决方法。
Element
中的折叠Range
具有内容。(很可能是您的情况)**在最近的
TextNode
上设置Range
将允许浏览器正确地计算框:尽管元素的
firstChild
也可能不是TextNode
,所以实际上需要一个方法来检索Element
中的第一个TextNode
:一个二个一个一个
Element
中的Range
(因此没有TextNode
可供选择)**对于这个示例,您可以尝试在
Element
中附加一个零宽度空格(ZWSP)字符,在新创建的TextNode
上进行测量,然后删除该字符。Range
**这里你可以再一次使用ZWSP技巧。检测这个可能会变得更简洁一些,并且OP显然想在
Element
的开头设置插入符号,这对他们来说似乎是不可能的。所以我将离开这个例子。