2009-08-22 30 views
15

No se pudo encontrar nada al respecto con una búsqueda en Google.¿Cómo copiar al portapapeles con GWT?

¿Alguien sabe cómo copiar algo de texto en el portapapeles a través del código GWT Java? Me gustaría evitar la solución de inyección de JavaScript sin formato.

Cualquier ayuda o consejos apreciados.

+0

gwt realidad compila el código Java a JavaScript, por lo que cuando se ejecuta, en realidad JavaScript que se ejecuta. – helloandre

+0

Lo sé, pero si no lo escribo no tengo que preocuparme de que funcione en todos los navegadores – JohnIdol

+0

Me refiero a la inyección de JavaScript sin procesar desde el código de GWT – JohnIdol

Respuesta

3

Por el momento, no parece que haya ninguna biblioteca GWT que brinde esta funcionalidad. En cualquier caso, es imposible admitir esto en todos los navegadores ya que se necesita Flash. Una biblioteca bastante agradable que envuelve la funcionalidad es ZeroClipboard.

+0

Anticuado, mira a continuación. – ArcTanH

5

El siguiente código funcionó bien para mí en cromo:

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

Aquí una solución sin JS nativos, pero gwt elemental lugar, siendo inspirado por @SushmithaShenoy, dejando esto aquí Para futura referencia.

condición previa:

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

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

ahora el código 'real', tal vez colocado en un 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 no es compatible de forma nativa el comando $doc.execCommand('copy');, pero es muy fácil.

Primero fije el foco en el elemento, seleccione el texto y cópielo.

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

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

Solo envuelva la respuesta proporcionada https://stackoverflow.com/a/30810322/106261.

Por lo tanto, transfiere cualquier texto a una función/método nativo de JavaScript, la función js crea un elemento nuevo y copia al portapapeles, y elimina el elemento después de la copia.

No necesita libs con nuevos navegadores.

manera:

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); 
    }-*/; 
Cuestiones relacionadas