2009-08-22 17 views
15

Nie można znaleźć niczego na ten temat za pomocą wyszukiwarki Google.Jak skopiować do schowka za pomocą GWT?

Czy ktoś wie, jak skopiować tekst do schowka za pomocą kodu Java GWT? Chciałbym uniknąć surowego rozwiązania do wstrzykiwania javascript.

Każda pomoc lub wskazówki są mile widziane.

+0

GWT faktycznie kompiluje kod java się javascript, więc kiedy działa, to faktycznie działa javascript. – helloandre

+0

Znam człowieka - ale jeśli go nie piszę, nie muszę się martwić, że działa na wszystkich przeglądarkach. – JohnIdol

+0

Mam na myśli surową iniekcje javascript z kodu GWT – JohnIdol

Odpowiedz

3

W tej chwili nie wydaje się, że istnieją biblioteki GWT, które zapewniają tę funkcjonalność. W każdym razie nie można tego poprzeć we wszystkich przeglądarkach, ponieważ Flash jest potrzebny. Dość fajną biblioteką, która owija funkcjonalność, jest ZeroClipboard.

+0

Nieaktualne, patrz poniżej. – ArcTanH

5

Poniższy kod pracował dobrze dla mnie w Chrome:

public static native void copyToClipboard() /*-{ 
    var selection = $wnd.getSelection(); 
    var text = $doc.getElementById("myElement"); 
    var range = $doc.createRange(); 
    range.selectNodeContents(text); 
    selection.removeAllRanges(); 
    selection.addRange(range); 
    $doc.execCommand('copy'); 
    selection.removeAllRanges(); 
}-*/; 
1

Oto rozwiązanie bez rodzimych JS, ale zamiast GWT pierwiastkowy, nadal zainspirowany @SushmithaShenoy, pozostawiając to tutaj dla przyszłego odniesienia.

warunek:

import elemental.client.Browser; 
import elemental.html.Selection; 
import elemental.ranges.Range; 

Label.getElement().setAttribute("id","your_element_id"); //unique ID! 

teraz 'prawdziwe' kod, może umieścić w clickHandler:

final Selection selection = Browser.getWindow().getSelection(); 
final Range range = Browser.getDocument().createRange(); 
range.selectNodeContents(Browser.getDocument().getElementById(""you_elements_id")); 
selection.removeAllRanges(); 
selection.addRange(range); 
Browser.getWindow().getDocument().execCommand("copy", false, ""); 
selection.removeAllRanges(); 
2

GWT nie natywnie obsługują komendy $doc.execCommand('copy');, ale jest to bardzo proste.

Najpierw ustaw fokus na przedmiocie, zaznacz tekst, a następnie go skopiuj.

myTextBox.setFocus(true); 
myTextBox.selectAll(); 
boolean success = copyToClipboard(); 

private static native boolean copyToClipboard() /*-{ 
    return $doc.execCommand('copy'); 
}-*/; 
0

Wystarczy owinąć dostarczoną odpowiedź https://stackoverflow.com/a/30810322/106261.

Tak więc, przekazujesz dowolny tekst do natywnej funkcji/metody javascript, funkcja js tworzy nowy element i kopiuje do schowka, i usuwa element po skopiowaniu.

Nie potrzebujesz żadnych bibliotek z nowymi przeglądarkami.

tak:

public static native void copyTextToClipboard(String text) /*-{ 
     var textArea = document.createElement("textarea"); 
     // 
     // *** This styling is an extra step which is likely not required. *** 
     // 
     // Why is it here? To ensure: 
     // 1. the element is able to have focus and selection. 
     // 2. if element was to flash render it has minimal visual impact. 
     // 3. less flakyness with selection and copying which **might** occur if 
     // the textarea element is not visible. 
     // 
     // The likelihood is the element won't even render, not even a flash, 
     // so some of these are just precautions. However in IE the element 
     // is visible whilst the popup box asking the user for permission for 
     // the web page to copy to the clipboard. 
     // 

     // Place in top-left corner of screen regardless of scroll position. 
     textArea.style.position = 'fixed'; 
     textArea.style.top = 0; 
     textArea.style.left = 0; 

     // Ensure it has a small width and height. Setting to 1px/1em 
     // doesn't work as this gives a negative w/h on some browsers. 
     textArea.style.width = '2em'; 
     textArea.style.height = '2em'; 

     // We don't need padding, reducing the size if it does flash render. 
     textArea.style.padding = 0; 

     // Clean up any borders. 
     textArea.style.border = 'none'; 
     textArea.style.outline = 'none'; 
     textArea.style.boxShadow = 'none'; 

     // Avoid flash of white box if rendered for any reason. 
     textArea.style.background = 'transparent'; 


     textArea.value = text; 

     document.body.appendChild(textArea); 

     textArea.select(); 

     try { 
      var successful = document.execCommand('copy'); 
     } catch (err) { 
      console.log('Unable to copy'); 
     } 
     document.body.removeChild(textArea); 
    }-*/; 
Powiązane problemy