GWTRichTextAreaでcusrorの位置を設定する方法はありますか?TextAreaにはこれを行うためのメソッドsetCusrorPosition()がありますが、RichTextAreaにはありません。
おそらく、RichTextAreaでカーソル位置を設定できるネイティブJavaScript(GWTから呼び出される)がありますか?
GWTRichTextAreaでcusrorの位置を設定する方法はありますか?TextAreaにはこれを行うためのメソッドsetCusrorPosition()がありますが、RichTextAreaにはありません。
おそらく、RichTextAreaでカーソル位置を設定できるネイティブJavaScript(GWTから呼び出される)がありますか?
そうです、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);
注:setSelectionRange()メソッドに渡す「pos」と「length」の検証チェックを忘れずに行ってください。このコードは、IE9、FF、Chromeでテストされています。
これがまだ必要かどうかはわかりませんが、私はこれを1日中機能させるように努めており、ようやく解決策への道を切り開くことができました。これは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日に編集されました。