8 votes

Copier du texte dans le presse-papiers avec PHP et JavaScript ?

Je veux inclure un bouton sur une page Web existante qui copiera le texte dans le presse-papiers de Windows.

La page Web et le PHP qu'elle contient fonctionnent déjà bien pour créer et afficher un texte comme celui-ci :

Sortie sur la page web :

'Abby Normal' <abnormal@rockyhorror.com>, 'Brad Majors' <bm@rockyhorror.com>, 'Frank N. Furter' <franknfurter@rockyhorror.com>

Je veux maintenant ajouter une fonction Javascript et un bouton html qui appelle cette fonction pour copier cette sortie dans le presse-papiers de Windows.

Problème : rien n'est copié lorsque l'on appuie sur le bouton. Qu'est-ce que je fais de mal ? Merci d'avance.

<?PHP
  session_start();
  include('include/_initsess.php');
  include('include/_setdb.php');
  if(!isset($_SESSION['userlist'])) exit;
  $users = $_SESSION['userlist'];
  $emails = '';
  $qry = "SELECT FIRST,LAST,EMAIL FROM users WHERE PKEY IN ($users)";
  $result  = mysql_query($qry);     
  $numrows = mysql_num_rows($result);   
  for ($m=0; $m<$numrows; $m++) {
    $row = mysql_fetch_array($result); 
    list($fn,$ln,$em) = $row;
    $emails .= ($m==0) ? "'".$fn." ".$ln."' &lt;".$em."&gt;" : (", '".$fn." ".$ln."' &lt;".$em."&gt;");
    } // end for
?>

<html>
<head>
</head>
<body>
<span class=mono id="theList" value="<?php echo $emails; ?>">
  <?PHP echo($emails); ?>
</span>

<script>
function copyToClipboardWithJavascript() {
  /* Get the text field */
  var copyText = document.getElementById("theList");
  /* Select the text field */
  copyText.select();
  /* Copy the text inside the text field */
  document.execCommand("copy");
}
</script>

<button onclick="copyToClipboardWithJavascript()">Click here</button>

</span>
</body>
</html>

J'ai essayé la méthode suggérée par un tutoriel Javascript :

var copyText = = document.getElementById("theList");

Et mes propres variations en utilisant PHP dans Javascript :

var copyText = <?PHP echo($emails); ?>;
var copyText = `<?PHP echo($emails); ?>`;
var copyText = "<?PHP echo($emails); ?>";
var copyText = '<?PHP echo($emails); ?>';

Mais le résultat est que rien ne provoque d'erreur et rien n'est copié dans le presse-papiers.

Je sais que la page Web est immédiatement sauvegardée et utilisée, car j'ai également apporté une modification triviale aux lettres "Click here" dans le bouton et je peux voir la différence après le rafraîchissement. enter code here

***MISE À JOUR AVEC LA RÉPONSE QUE J'AI UTILISÉE : ****

<span class=mono id="theList">
<?PHP echo($emails); ?>
</span>
<button id="copyButton" onclick="myCopyFunction()">Copy email address list to clipboard.</button>
<script>
function myCopyFunction() {
  var myText = document.createElement("textarea")
  myText.value = document.getElementById("theList").innerHTML;
  myText.value = myText.value.replace(/&lt;/g,"<");
  myText.value = myText.value.replace(/&gt;/g,">");
  document.body.appendChild(myText)
  myText.focus();
  myText.select();
  document.execCommand('copy');
  document.body.removeChild(myText);
}
</script>

13voto

Brandon Dixon Points 444

Voici un exemple fonctionnel que j'ai réalisé :

Il y a deux choses que vous devez savoir.

  1. Contrairement à la réponse précédente, vous pouvez effectivement copier une chaîne variable dans le presse-papiers, comme le montre mon exemple.
  2. L'utilisateur DOIT EXPLICITEMENT effectuer une action qui entraîne l'appel de la fonction de copie. Si elle est appelée automatiquement, la copie sera refusée. C'est très probablement la cause de votre problème.

Voici mon exemple. Pour expliquer brièvement comment cela fonctionne : un nouvel élément temporaire de type input type='text' est créé, on lui donne la valeur à copier dans le presse-papiers, puis la commande de copie est exécutée, et enfin cet élément temporaire est supprimé.

copyToClipboard(document.getElementById("content"));

document.getElementById("clickCopy").onclick = function() {
    copyToClipboard(document.getElementById("goodContent"));
}

document.getElementById("clickCopyString").onclick = function() {
    copyToClipboard("This is a variable string");
}

/**
* This will copy the innerHTML of an element to the clipboard
* @param element reference OR string
*/
function copyToClipboard(e) {
    var tempItem = document.createElement('input');

    tempItem.setAttribute('type','text');
    tempItem.setAttribute('display','none');

    let content = e;
    if (e instanceof HTMLElement) {
            content = e.innerHTML;
    }

    tempItem.setAttribute('value',content);
    document.body.appendChild(tempItem);

    tempItem.select();
    document.execCommand('Copy');

    tempItem.parentElement.removeChild(tempItem);
}

div {
  border: 1px solid black;
  margin: 10px;
  padding: 5px;
}

<div id="content">
This is example text which will NOT be copied to the clipboard.
</div>
<div id="goodContent">
This WILL be copied to the cliboard when you push the button below:
</div>
<button id="clickCopy">
Copy Text from 2nd
</button>

<button id="clickCopyString">
Copy STRING to Clibpoard from Variable
</button>

3voto

Barmar Points 135986

Vous ne pouvez pas copier directement à partir d'une chaîne de caractères, mais uniquement à partir d'un élément HTML. Vous devez placer la chaîne PHP dans la valeur de l'élément.

function copyToClipboardWithJavascript() {
  /* Get the text field */
  var copyText = document.getElementById("theList");
  /* Put emails into the text field */
  copyText.value = <?php echo json_encode($emails); ?>;
  /* Select the text field */
  copyText.select();
  /* Copy the text inside the text field */
  document.execCommand("copy");
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X