在空白行上的光标位置插入文本失败

时间:2013-06-14 15:32:29

标签: javascript gwt

我在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不是正确的对象类型。我想有人会知道它实际上是什么类型的物体,可以帮助我处理这种情况。

2 个答案:

答案 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);
    }
}-*/;
相关问题