如何从GWT中的RichTextArea获取光标位置或位置?

7

我想要获取RichTextArea中光标的位置或者坐标,但是不知道如何在没有鼠标事件的情况下获取当前光标位置。

比如说,TextArea有一个名为getCursorPos()的方法,但是RichTextArea并没有类似于TextArea的方法。

请问有谁有什么好的想法吗?

提前感谢您的回答...

4个回答

2
如果您想在RichTextArea的光标位置插入某些内容,可以使用格式化器(formatter)来实现:
RichTextArea.Formatter formatter = richText.getFormatter();
formatter.insertHTML("My text is inserted at the cursor position");

使用JavaScript查找光标位置,可以尝试Tim Down提出的解决方案:
获取范围相对于其父容器的起始和结束偏移量。
链接:Get a range's start and end offset's relative to its parent container

1
这个不起作用!尝试将值设置为“<b>01234</b>56789”,然后将光标移动到末尾。你会看到值是6而不是10。 - yazzapps.com
@Andrei,当调用getSelection()时,我应该将RichTextArea作为元素发送吗?我在调用getSelection()时发送了我的RichTextArea,但是出现了空异常。 - junaidp
这个函数返回每一行从0开始的索引,如果我在第三行第四个单词,它会显示第四个索引。但是它忽略了前面的三行,这是不正确的。 - junaidp
我删除了不符合所有用例的代码,并建议了另一种解决方案。 - Andrei Volgin

1
在 Vaadin 7.5 中,@AndreiVolgin 的回答似乎不起作用。但是,如果有人只想在光标位置粘贴一些文本,则 Vaadin 的 CKEditor 包装器插件可能会有所帮助(link)。下面是一个例子,供后人参考:
CKEditorTextField textArea;
// and for example in some listener function we could call:
textArea.insertHtml("<b>some html</b>");
textArea.insertText("sample text");

0

试一下这个,对我有用。基本上你在富文本区域插入一个唯一的文本,然后获取插入文本的索引,最后将其删除。

    richText=new RichTextArea();
    basicFormatter=richText.getFormatter();
    basicFormatter.insertHTML("dummydata");
    int cursor=richText.getText().indexOf("dummydata");
    basicFormatter.undo();

0

不知道这是否仍然需要,但我今天一直在尝试做完全相同的事情,却没有找到明确的答案。我找到了这个非GWT解决方案(Get caret (cursor) position in contentEditable area containing HTML content),需要微调一下。希望这能帮助到某些人。

    public static native int getCursor(Element elem) /*-{
    var node = elem.contentWindow.document.body
    var range = elem.contentWindow.getSelection().getRangeAt(0);

    var treeWalker = $doc.createTreeWalker(node, NodeFilter.SHOW_TEXT, function(node) {
        var nodeRange = $doc.createRange();
        nodeRange.selectNodeContents(node);
        return nodeRange.compareBoundaryPoints(Range.END_TO_END, range) < 1 ? NodeFilter.FILTER_ACCEPT
                : NodeFilter.FILTER_REJECT;
    }, false);

    var charCount = 0;
    while (treeWalker.nextNode()) {
        charCount += treeWalker.currentNode.length;
    }

    if (range.startContainer.nodeType == 3) {
        charCount += range.startOffset;
    }

    return charCount;
}-*/;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接