2013-06-14 6 views
2

Я использую этот собственный метод javascript в GWT для вставки текста в позицию курсора RichTextArea. Он работает иногда, но часто дает мне сообщение об ошибке: «refNode.insertData не является функцией Это, кажется, происходит всякий раз, когда курсор находится на пустую строкеВставить текст в позицию курсора, не используя пустые строки

public native void insertText(String text, int pos) /*-{ 
    var elem = [email protected]::getElement()(); 
    var refNode = elem.contentWindow.getSelection().getRangeAt(0).endContainer; 
    refNode.insertData(pos, text); 
}-*/; 

Так что мне нужно, чтобы отладить этот яваскрипт и Дон».. я знаю, с чего начать. Я знаю очень мало о javascript и получил только этот метод, который я использую из стека question. Я получаю позицию курсора из другого родного метода, который я скопировал из этого question.

Я читал, что эта ошибка связана с тем, что refNode не является правильным типом объекта. Я полагал, что кто-то знает, какой тип объекта он на самом деле и может мне помочь справиться с этой ситуацией.

ответ

0

Так что у меня это работает, я думаю. Я немного изменил ответ Мэтью и, похоже, работал во всех моих тестах. Когда refNode равно Element type, я полагаю, что значение pos всегда было индексом элемента дочернего узла, в который мне нужно было вставить ранее.

public native void insertText(String text, int pos) /*-{ 
    var elem = [email protected]::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); 
    } 
}-*/; 
2

Я предполагаю, что проблема в refNode не соответствует типу. Одним из возможных решений является проверка типа refNode, и если он не имеет тип TEXT_NODE, создайте текстовый узел и добавьте его в refData. Код будет выглядеть примерно так:

public native void insertText(String text, int pos) /*-{ 
    var elem = [email protected]::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.

+0

Благодарим за отзыв. Однако это работает некорректно. Я выводил тип узла в предупреждении. Когда курсор находится в текстовых строках, я получаю nodeType = 3, это то, что обычно работает. На пустых строках nodeType = 1. Таким образом, вы можете изменить их. Я попытался изменить два блока if-else, и он работал немного лучше, только он вставил текст в конец текстовой области в nodeType: 1 строка. Я намного ближе, хотя спасибо. – Zip184

Смежные вопросы