4

我想模仿 macOS 中的行尾快捷方式行为。我有这个:

onKeyDown (event, change, next) {

    if (event.key === 'ArrowRight') {
        if (event.metaKey) {
            event.preventDefault();
            change.moveTo(5);
            return true;
        }
    }

    return next();
}

问题是现在偏移索引固定5change.moveTo(5).

如何找到当前行最后一个字符的索引?

4

1 回答 1

5

Slate 并不真正了解线条等,因此解决方案是获取原生范围并检查其边界框的坐标。

我创建了一个函数,它返回一行中最后一个可能位置的索引,或者返回当前文本块中的最后一个位置,如果插入符号在最后一行,则会发生这种情况。

getIndexLastCharOfLine () {
    const selection = window.getSelection()
    const range = selection.getRangeAt(0);
    const caretIndex = range.startOffset;
    const rect = range.getBoundingClientRect();
    const container = range.startContainer;
    const lastIndex = container.length;

    for (let i = caretIndex; i < lastIndex; i++) {
        const rangeTest = document.createRange();
        rangeTest.setStart(container, i);
        const rectTest = rangeTest.getBoundingClientRect();
        // if the y is different it means the test range is in a different line
        if (rectTest.y !== rect.y) return i - 1;
    }

    return lastIndex;
}
于 2018-10-17T00:23:29.077 回答