Javascript 在空白行的光标位置插入文本失败
我在GWT中使用这个本地javascript方法在RichTextArea的光标位置插入文本。它有时可以工作,但通常会给我以下错误消息:“refNode.insertData不是一个函数。当光标位于空行上时,似乎就会发生这种情况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()();
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行。不过我更接近了,谢谢。