2

我在 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 知之甚少,只得到了我正在使用的堆栈问题的这种方法。我从这个问题中复制的另一个本机方法获取光标位置。

我读到这个错误是因为 refNode 不是正确的对象类型。我想有人会知道它实际上是什么类型的对象,并且可以帮助我处理这种情况。

4

2 回答 2

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 可以在这里找到。

于 2013-06-15T02:15:08.937 回答
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);
    }
}-*/;
于 2013-06-17T15:47:19.950 回答