有没有办法在 GWT RichTextArea 中设置光标位置。在 TextArea 中有 setCusrorPosition() 方法,但在 RichTextArea 中没有。
也许有一个本机 JavaScript(从 GWT 调用)可以在 RichTextArea 中设置光标位置?
有没有办法在 GWT RichTextArea 中设置光标位置。在 TextArea 中有 setCusrorPosition() 方法,但在 RichTextArea 中没有。
也许有一个本机 JavaScript(从 GWT 调用)可以在 RichTextArea 中设置光标位置?
你是对的 RichTextArea 没有提供 setSelectionRange 方法,但我使用 JSNI 创建了一个。
下面是方法,
public native void setSelectionRange(Element elem, int pos, int length) /*-{
try {
var selection = null, range2 = null;
var iframeWindow = elem.contentWindow;
var iframeDocument = iframeWindow.document;
selection = iframeWindow.getSelection();
range2 = selection.getRangeAt(0);
//create new range
var range = iframeDocument.createRange();
range.setStart(selection.anchorNode, pos);
range.setEnd(selection.anchorNode, length);
//remove the old range and add the newly created range
if (selection.removeRange) { // Firefox, Opera, IE after version 9
selection.removeRange(range2);
} else {
if (selection.removeAllRanges) { // Safari, Google Chrome
selection.removeAllRanges();
}
}
selection.addRange(range);
} catch (e) {
$wnd.alert(e);
}
}-*/;
要使用上述方法,请编写以下代码:
final RichTextArea tr = new RichTextArea();
Button b = new Button("Test");
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
setSelectionRange(tr.getElement(), 15, 20);
tr.setFocus(true);
}
});
RootPanel.get().add(tr);
RootPanel.get().add(b);
注意:请记住将您传递的“pos”和“length”的验证检查放入 setSelectionRange() 方法。此代码已在 IE9、FF、Chrome 中测试。
不确定这是否仍然需要,但我一整天都在努力让它工作,最终设法破解了我的解决方案。这仅在 Chrome/Safari 中进行了测试。希望它可以帮助某人。
public static native void setCursor(Element elem, int pos, int length) /*-{
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 NodeFilter.FILTER_ACCEPT;
});
var charCount = 0;
while (treeWalker.nextNode()) {
if (charCount + treeWalker.currentNode.length > pos)
break;
charCount += treeWalker.currentNode.length;
}
var newRange = elem.contentWindow.document.createRange();
newRange.setStart(treeWalker.currentNode, 1);
newRange.setEnd(treeWalker.currentNode, 1);
var selection = elem.contentWindow.getSelection();
if (selection.removeRange) { // Firefox, Opera, IE after version 9
selection.removeRange(range);
} else if (selection.removeAllRanges) { // Safari, Google Chrome
selection.removeAllRanges();
}
selection.addRange(newRange);
}-*/;
此代码于 2016 年 11 月 28 日进行了编辑,以纠正轻微的语法错误。