我在GWT中使用这个本机javascript方法在RichTextArea的光标位置插入文本。它有时会工作,但经常会给我这个错误信息:“refNode.insertData不是一个函数。只要光标在空白行上,它就会发生。
public native void insertText(String text, int pos) /*-{
var elem = this.@com.google.gwt.user.client.ui.UIObject::getElement()();
var refNode = elem.contentWindow.getSelection().getRangeAt(0).endContainer;
refNode.insertData(pos, text);
}-*/;
所以我需要调试这个javascript,不知道从哪里开始。我对javascript知之甚少,只有这个方法我正在使用堆栈question。我从另一个从question复制的本机方法中获取光标位置。
我读到这个错误是因为refNode不是正确的对象类型。我想有人会知道它实际上是什么类型的物体,可以帮助我处理这种情况。
答案 0 :(得分:2)
我假设问题是refNode不是正确的类型。一种可能的解决方案是检查refNode的类型,如果它不是TEXT_NODE类型,则创建一个文本节点并将其添加到refData。代码看起来像:
public native void insertText(String text, int pos) /*-{
var elem = this.@com.google.gwt.user.client.ui.UIObject::getElement()();
var refNode = elem.contentWindow.getSelection().getRangeAt(0).endContainer;
if(refNode.nodeType == 3){
var newTxtNode = document.createTextNode(text);
refNode.appendChild(newTxtNode);
} else {
refNode.insertData(pos, text);
}
}-*/;
可以找到nodeType here。
答案 1 :(得分:0)
所以我认为这是有效的。我改变了马修的答案,似乎在我的所有测试中都有效。当refNode等于Element类型时,我猜pos值始终是我之前需要插入的子节点元素的索引。
public native void insertText(String text, int pos) /*-{
var elem = this.@com.google.gwt.user.client.ui.UIObject::getElement()();
var refNode = elem.contentWindow.getSelection().getRangeAt(0).endContainer;
if (refNode.nodeType == 1) {
var newTextNode = document.createTextNode(text);
refNode.insertBefore(newTextNode, refNode.childNodes[pos]);
} else {
refNode.insertData(pos, text);
}
}-*/;