Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在空白行的光标位置插入文本失败_Javascript_Gwt - Fatal编程技术网

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

Javascript 在空白行的光标位置插入文本失败,javascript,gwt,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()();

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

我假设问题是refNode不是正确的类型。一个可能的解决方案是检查refNode的类型,如果它不是TEXT\u NO类型DE,创建一个文本节点并将其添加到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);
    }
}-*/;

可以找到节点类型。

因此我认为这是可行的。我稍微更改了Matthew的答案,它似乎在我的所有测试中都有效。当refNode等于Element type时,我猜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);
    }
}-*/;

谢谢你的回应。这不正确。我在警告中输出节点类型。当光标在文本行上时,我得到NoDyType=3,这就是正常工作。空白行NoDyType=1。所以你可能会颠倒这些。我试着反转这两个if语句块,它工作得稍微好一点,只有它。在节点类型的文本区域的末尾插入文本:1行。不过我更接近了,谢谢。