2012-09-23 18 views
6

içinde konum belirleme konumu GWT RichTextArea'da denetim konumunu ayarlama yolu var mı? TextArea'da bunu yapmak için setCusrorPosition() yöntemi vardır, ancak RichTextArea'da yoktur. Belki de RichTextArea'da imleç konumunu ayarlayabilecek bir yerel JavaScript (GWT denir) var mı?GWT RichTextArea

cevap

1

Haklısınız RichTextArea setSelectionRange yöntemini sağlamaz, ancak JSNI kullanarak bir tane oluşturdum.

final RichTextArea tr = new RichTextArea(); 
    Button b = new Button("Test"); 
    b.addClickHandler(new ClickHandler() { 

     @Override 
     public void onClick(ClickEvent event) { 
      setSelectionRange(tr.getElement(), 15, 20); 
      tr.setFocus(true); 
     } 
    }); 
    RootPanel.get().add(tr); 
    RootPanel.get().add(b); 

Not: "pos" ve "uzunluk" doğrulama kontrollerini koymak hatırlıyor musunuz sen Aşağıda

public native void setSelectionRange(Element elem, int pos, int length) /*-{ 
    try { 
     var selection = null, range2 = null; 
     var iframeWindow = elem.contentWindow; 
     var iframeDocument = iframeWindow.document; 

     selection = iframeWindow.getSelection(); 
     range2 = selection.getRangeAt(0); 

     //create new range 
     var range = iframeDocument.createRange(); 
     range.setStart(selection.anchorNode, pos); 
     range.setEnd(selection.anchorNode, length); 

     //remove the old range and add the newly created range 
     if (selection.removeRange) { // Firefox, Opera, IE after version 9 
      selection.removeRange(range2); 
     } else { 
      if (selection.removeAllRanges) { // Safari, Google Chrome 
       selection.removeAllRanges(); 
      } 
     } 
     selection.addRange(range); 
    } catch (e) { 
     $wnd.alert(e); 
    } 
}-*/; 

kodunun altında yöntem yazma üstünde kullanmak için, yöntem setSelectionRange() yönteminde geçiriliyor. Bu kod IE9, FF, Chrome'da test edilmiştir.

+0

Bu, GWT 2.5'te benim için çalışmıyor. İmleci hareket ettiriyor ama tahmin edilemez. Uzunluk parametresi imleç konumunu etkiler ve seçim asla bir aralık değildir, daima imleci hareket ettirir (vurgulama yok). – Zip184

+0

Bir richtextarea yerine bir contenteditable div kullanılabilir. –

1

Bunun hala gerekli olup olmadığından emin değilim, ancak bunu tüm gün çalışmayı denedim ve sonunda bir çözüm yolumu kesmeyi başardım. Bu, yalnızca Chrome/Safari'de test edildi. Umarım birisine yardım eder.

public static native void setCursor(Element elem, int pos, int length) /*-{ 
    var node = elem.contentWindow.document.body; 
    var range = elem.contentWindow.getSelection().getRangeAt(0); 

    var treeWalker = $doc.createTreeWalker(node, NodeFilter.SHOW_TEXT, function(node) { 
     var nodeRange = $doc.createRange(); 
     nodeRange.selectNodeContents(node); 
     return NodeFilter.FILTER_ACCEPT; 
    }); 

    var charCount = 0; 
    while (treeWalker.nextNode()) { 
     if (charCount + treeWalker.currentNode.length > pos) 
      break; 

     charCount += treeWalker.currentNode.length; 
    } 

    var newRange = elem.contentWindow.document.createRange(); 
    newRange.setStart(treeWalker.currentNode, 1); 
    newRange.setEnd(treeWalker.currentNode, 1); 

    var selection = elem.contentWindow.getSelection(); 

    if (selection.removeRange) { // Firefox, Opera, IE after version 9 
     selection.removeRange(range); 
    } else if (selection.removeAllRanges) { // Safari, Google Chrome 
     selection.removeAllRanges(); 
    } 

    selection.addRange(newRange); 
}-*/; 

Bu kod, 28 Kasım 2016 tarihinde küçük sözdizimi hatalarını düzeltmek üzere düzeltilmiştir.