2009-08-22 5 views
15

Impossible de trouver quelque chose à ce sujet avec une recherche Google.Comment copier dans le presse-papier avec GWT?

Est-ce que quelqu'un sait comment copier du texte dans le presse-papier via le code Java GWT? Je souhaite éviter la solution d'injection javascript brute.

Toute aide ou pointeur apprécié.

+0

GWT compile réellement votre code Java et JavaScript, donc quand il fonctionne, il est en fait le javascript en cours d'exécution. – helloandre

+0

Je sais l'homme - mais si je ne l'écris pas je n'ai pas à m'inquiéter de travailler sur tous les navigateurs – JohnIdol

+0

Je voulais dire l'injection javascript brut du code GWT – JohnIdol

Répondre

3

Pour l'instant, il ne semble pas qu'il existe de bibliothèques GWT offrant cette fonctionnalité. Dans tous les cas, il est impossible de supporter cela dans tous les navigateurs car Flash est nécessaire. Une bibliothèque plutôt agréable que la fonctionnalité wraps est ZeroClipboard.

+0

Périmé, voir ci-dessous. – ArcTanH

5

Le code suivant a bien fonctionné pour moi en 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

Voici une solution sans JS native, mais GWT élémentaire au lieu, inspiré encore par @SushmithaShenoy, laissant ici ce pour référence future.

condition:

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

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

maintenant le code 'réel', peut-être placé dans 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 ne supporte pas nativement la commande $doc.execCommand('copy');, mais il est super facile.

Commencez par mettre l'accent sur l'élément, sélectionnez le texte, puis copiez-le.

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

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

Juste enveloppez la réponse fournie https://stackoverflow.com/a/30810322/106261. Donc, vous passez n'importe quel texte à une fonction/méthode native javascript, la fonction js crée un nouvel élément et copie dans le presse-papier, et supprime l'élément après la copie.

Pas besoin de bibliothèques avec de nouveaux navigateurs.

donc:

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