Comment copier le texte d'une div dans le presse-papier? J'ai un div et ai besoin d'ajouter un lien qui ajoutera le texte au presse-papiers. Y a-t-il une solution pour cela?
<p class="content">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s</p>
<a class="copy-text">copy Text</a>
Après avoir cliqué sur Copier le texte, j'ai appuyé sur Ctrl + V, il doit être collé.
Éditer depuis 2016
À partir de 2016, vous pouvez désormais copier du texte dans le presse-papiers dans la plupart des navigateurs, car la plupart des navigateurs ont la possibilité de copier par programme une sélection de texte dans le presse-papiers à l'aide de document.execCommand("copy")
qui fonctionne à partir d'une sélection.
Comme pour d'autres actions dans un navigateur (comme ouvrir une nouvelle fenêtre), la copie dans le presse-papier ne peut être effectuée que par une action utilisateur spécifique (comme un clic de souris). Par exemple, cela ne peut pas être fait via une minuterie.
Voici un exemple de code:
document.getElementById("copyButton").addEventListener("click", function() {
copyToClipboard(document.getElementById("copyTarget"));
});
function copyToClipboard(elem) {
// create hidden text element, if it doesn't already exist
var targetId = "_hiddenCopyText_";
var isInput = elem.tagName === "INPUT" || elem.tagName === "TEXTAREA";
var origSelectionStart, origSelectionEnd;
if (isInput) {
// can just use the original source element for the selection and copy
target = elem;
origSelectionStart = elem.selectionStart;
origSelectionEnd = elem.selectionEnd;
} else {
// must use a temporary form element for the selection and copy
target = document.getElementById(targetId);
if (!target) {
var target = document.createElement("textarea");
target.style.position = "absolute";
target.style.left = "-9999px";
target.style.top = "0";
target.id = targetId;
document.body.appendChild(target);
}
target.textContent = elem.textContent;
}
// select the content
var currentFocus = document.activeElement;
target.focus();
target.setSelectionRange(0, target.value.length);
// copy the selection
var succeed;
try {
succeed = document.execCommand("copy");
} catch(e) {
succeed = false;
}
// restore original focus
if (currentFocus && typeof currentFocus.focus === "function") {
currentFocus.focus();
}
if (isInput) {
// restore prior selection
elem.setSelectionRange(origSelectionStart, origSelectionEnd);
} else {
// clear temporary content
target.textContent = "";
}
return succeed;
}
input {
width: 400px;
}
<input type="text" id="copyTarget" value="Text to Copy"> <button id="copyButton">Copy</button><br><br>
<input type="text" placeholder="Click here and press Ctrl-V to see clipboard contents">
Voici une démo un peu plus avancée: https://jsfiddle.net/jfriend00/v9g1x0o6/
Et, vous pouvez également obtenir une bibliothèque pré-construite qui le fait pour vous avec clipboard.js .
Ancien, partie historique de la réponse
La copie directe dans le Presse-papiers via JavaScript n'est pas autorisée par les navigateurs modernes pour des raisons de sécurité. La solution la plus courante consiste à utiliser une fonctionnalité Flash pour la copie dans le Presse-papiers, qui ne peut être déclenchée que par un clic direct de l'utilisateur.
Comme mentionné précédemment, ZeroClipboard est un ensemble de code populaire permettant de gérer l'objet Flash pour effectuer la copie. Je l'ai utilisé. Si Flash est installé sur le périphérique de navigation (ce qui exclut le mobile ou la tablette), cela fonctionne.
L’autre solution la plus courante consiste à placer le texte lié au presse-papier dans un champ de saisie, à déplacer le focus sur ce champ et à conseiller à l’utilisateur de cliquer sur Ctrl + C copier le texte.
Vous trouverez d'autres discussions sur le problème et des solutions de contournement possibles dans ces publications antérieures de Stack Overflow:
Comment copier du texte dans le presse-papier du client à l'aide de jQuery?
Comment pouvez-vous copier dans le presse-papier sans Flash?
Ces questions demandant une alternative moderne à l’utilisation de Flash ont reçu beaucoup de votes positifs et pas de réponse avec une solution (probablement parce qu’il n’en existe pas):
Internet Explorer et Firefox avaient des API non standard pour accéder au presse-papiers, mais leurs versions les plus modernes ont déconseillé ces méthodes (probablement pour des raisons de sécurité).
Il y a un effort de normalisation naissant pour essayer de trouver un moyen "sûr" de résoudre les problèmes de presse-papiers les plus courants (nécessitant probablement une action spécifique de la part de l'utilisateur, telle que la solution Flash l'exige), peut être partiellement implémenté dans les dernières versions de Firefox et Chrome, mais je ne l’ai pas encore confirmé.
Il existe une autre méthode non Flash (hormis la API Clipboard mentionnée dans réponse de jfriend00 ). Vous devez sélectionner le texte, puis exécuter la commande copy
pour copier dans le Presse-papiers le texte actuellement sélectionné sur la page.
Par exemple, cette fonction copiera le contenu de l'élément passé dans le presse-papiers (mis à jour avec la suggestion dans les commentaires de PointZeroTwo ):
function copyToClipboard(element) {
var $temp = $("<input>");
$("body").append($temp);
$temp.val($(element).text()).select();
document.execCommand("copy");
$temp.remove();
}
Voilà comment cela fonctionne:
document.execCommand("copy")
.Vous pouvez voir une démo rapide ici:
function copyToClipboard(element) {
var $temp = $("<input>");
$("body").append($temp);
$temp.val($(element).text()).select();
document.execCommand("copy");
$temp.remove();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p id="p1">P1: I am paragraph 1</p>
<p id="p2">P2: I am a second paragraph</p>
<button onclick="copyToClipboard('#p1')">Copy P1</button>
<button onclick="copyToClipboard('#p2')">Copy P2</button>
<br/><br/><input type="text" placeholder="Paste here for test" />
Le problème principal est que toutes les navigateurs pris en charge cette fonctionnalité pour le moment, mais vous pouvez l'utiliser pour les principales à partir de:
Mise à jour 1: Ceci peut également être réalisé avec une solution JavaScript pure (pas de jQuery):
function copyToClipboard(elementId) {
// Create a "hidden" input
var aux = document.createElement("input");
// Assign it the value of the specified element
aux.setAttribute("value", document.getElementById(elementId).innerHTML);
// Append it to the body
document.body.appendChild(aux);
// Highlight its content
aux.select();
// Copy the highlighted text
document.execCommand("copy");
// Remove it from the body
document.body.removeChild(aux);
}
<p id="p1">P1: I am paragraph 1</p>
<p id="p2">P2: I am a second paragraph</p>
<button onclick="copyToClipboard('p1')">Copy P1</button>
<button onclick="copyToClipboard('p2')">Copy P2</button>
<br/><br/><input type="text" placeholder="Paste here for test" />
Notez que nous passons l'identifiant sans le # maintenant.
Comme madzohan } _ signalé dans les commentaires ci-dessous, il existe dans certains cas un problème étrange avec la version 64 bits de Google Chrome (exécution du fichier localement). Ce problème semble être résolu avec la solution ci-dessus non-jQuery.
Madzohan a essayé dans Safari et la solution a fonctionné, mais en utilisant document.execCommand('SelectAll')
au lieu d’utiliser .select()
(comme spécifié dans le chat et dans les commentaires ci-dessous).
Comme PointZeroTwo indique dans les commentaires , le code pourrait être amélioré afin de renvoyer un résultat de succès/échec. Vous pouvez voir une démo sur this jsFiddle .
En tant que utilisateur indiqué dans la version espagnole de StackOverflow , les solutions répertoriées ci-dessus fonctionnent parfaitement si vous souhaitez copier le contenu d'un élément à la lettre, mais elles ne fonctionnent pas très bien si vous souhaitez coller texte copié avec le format (comme il est copié dans un input type="text"
, le format est "perdu").
Une solution pour cela serait de copier dans un contenu éditable div
et de le copier ensuite à l'aide de execCommand
d'une manière similaire. Voici un exemple - cliquez sur le bouton Copier puis collez-le dans le champ modifiable ci-dessous:
function copy(element_id){
var aux = document.createElement("div");
aux.setAttribute("contentEditable", true);
aux.innerHTML = document.getElementById(element_id).innerHTML;
aux.setAttribute("onfocus", "document.execCommand('selectAll',false,null)");
document.body.appendChild(aux);
aux.focus();
document.execCommand("copy");
document.body.removeChild(aux);
}
#target {
width:400px;
height:100px;
border:1px solid #ccc;
}
<p id="demo"><b>Bold text</b> and <u>underlined text</u>.</p>
<button onclick="copy('demo')">Copy Keeping Format</button>
<div id="target" contentEditable="true"></div>
Et dans jQuery, ce serait comme ça:
function copy(selector){
var $temp = $("<div>");
$("body").append($temp);
$temp.attr("contenteditable", true)
.html($(selector).html()).select()
.on("focus", function() { document.execCommand('selectAll',false,null) })
.focus();
document.execCommand("copy");
$temp.remove();
}
#target {
width:400px;
height:100px;
border:1px solid #ccc;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p id="demo"><b>Bold text</b> and <u>underlined text</u>.</p>
<button onclick="copy('#demo')">Copy Keeping Format</button>
<div id="target" contentEditable="true"></div>
clipboard.js est un utilitaire Nice qui permet de copier du texte ou des données HTML dans le presse-papiers sans utiliser Flash. C'est très facile à utiliser. incluez simplement le .js et utilisez quelque chose comme ceci:
<button id='markup-copy'>Copy Button</button>
<script>
document.getElementById('markup-copy').addEventListener('click', function() {
clipboard.copy({
'text/plain': 'Markup text. Paste me into a rich text editor.',
'text/html': '<i>here</i> is some <b>rich text</b>'
}).then(
function(){console.log('success'); },
function(err){console.log('failure', err);
});
});
</script>
clipboard.js est aussi sur GitHub .
Éditer le 15 janvier 2016: La réponse principale était a été modifiée aujourd'hui pour faire référence à la même API dans ma réponse publiée en août 2015. Le texte précédent indiquait aux utilisateurs d'utiliser ZeroClipboard. Je veux juste être clair sur le fait que je n’ai pas tiré cela de la réponse de jfriend00, mais plutôt l’inverse.
Avec sauts de ligne (extension de la réponse d'Alvaro Montoro)
var ClipboardHelper = {
copyElement: function ($element)
{
this.copyText($element.text())
},
copyText:function(text) // Linebreaks with \n
{
var $tempInput = $("<textarea>");
$("body").append($tempInput);
$tempInput.val(text).select();
document.execCommand("copy");
$tempInput.remove();
}
};
ClipboardHelper.copyText('Hello\nWorld');
ClipboardHelper.copyElement($('body h1').first());
Encore mieux, sans flash ni autre exigence: clipboard.js . Tout ce que vous avez à faire est d’ajouter data-clipboard-target="#toCopyElement"
à n’importe quel bouton, de l’initialiser new Clipboard('.btn');
et il copiera le contenu de DOM avec id toCopyElement
dans le presse-papiers. Ceci est un extrait qui copie le texte fourni dans votre question via un lien.
Une limite cependant est que cela ne fonctionne pas sur safari, mais sur tous les autres navigateurs, y compris les navigateurs mobiles, car il n’utilise pas de flash.
$(function(){
new Clipboard('.copy-text');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/clipboard.js/1.5.12/clipboard.min.js"></script>
<p id="content">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s</p>
<a class="copy-text" data-clipboard-target="#content" href="#">copy Text</a>
La simplicité est la sophistication ultime.
Si vous ne voulez pas que le texte à copier soit visible:
jQuery:
$('button.copyButton').click(function(){
$(this).siblings('input.linkToCopy').select();
document.execCommand("copy");
});
HTML:
<button class="copyButton">click here to copy</button>
<input class="linkToCopy" value="TEXT TO COPY"
style="position: absolute; z-index: -999; opacity: 0;"><input>
<div class="form-group">
<label class="font-normal MyText">MyText to copy</label>
<button type="button" class="btn btn-default btn-xs btnCopy" data="MyText">Copy</button>
</div>
$(".btnCopy").click(function () {
var element = $(this).attr("data");
copyToClipboard($('.' + element));
});
function copyToClipboard(element) {
var $temp = $("<input>");
$("body").append($temp);
$temp.val($(element).text()).select();
document.execCommand("copy");
$temp.remove();
}
<!DOCTYPE html>
<html>
<head>
<title></title>
<link href="css/index.css" rel="stylesheet" />
<script src="js/jquery-2.1.4.min.js"></script>
<script>
function copy()
{
try
{
$('#txt').select();
document.execCommand('copy');
}
catch(e)
{
alert(e);
}
}
</script>
</head>
<body>
<h4 align="center">Copy your code</h4>
<textarea id="txt" style="width:100%;height:300px;"></textarea>
<br /><br /><br />
<div align="center"><span class="btn-md" onclick="copy();">copy</span></div>
</body>
</html>
C'est une méthode simple pour copier le contenu
<div id="content"> Lorepm ispum </div>
<button class="copy" title="content">Copy Sorce</button>
function SelectContent(element) {
var doc = document
, text = doc.getElementById(element)
, range, selection
;
if (doc.body.createTextRange) {
range = document.body.createTextRange();
range.moveToElementText(text);
range.select();
} else if (window.getSelection) {
selection = window.getSelection();
range = document.createRange();
range.selectNodeContents(text);
selection.removeAllRanges();
selection.addRange(range);
}
document.execCommand('Copy');
}
$(".copy").click(function(){
SelectContent( $(this).attr('title'));
});
Vous pouvez utiliser ce code pour copier une valeur d'entrée dans une page du Presse-papiers en cliquant sur un bouton.
C'est html
<input type="text" value="xxx" id="link" class="span12" />
<button type="button" class="btn btn-info btn-sm" onclick="copyToClipboard('#link')">
Copy Input Value
</button>
Ensuite, pour ce code HTML, nous devons utiliser ce code JQuery
function copyToClipboard(element) {
$(element).select();
document.execCommand("copy");
}
C'est la solution la plus simple pour cette question
vous pouvez simplement utiliser cette librairie pour réaliser facilement l'objectif de copie!
Copier du texte dans le presse-papiers ne devrait pas être difficile. Cela ne devrait pas nécessiter des dizaines d'étapes à configurer ou des centaines de Ko à charger. Mais la plupart de tout cela, il ne devrait pas dépendre de Flash ou de tout framework gonflé.
C'est pourquoi clipboard.js existe.
ou
https://github.com/zeroclipboard/zeroclipboard
La bibliothèque ZeroClipboard offre un moyen simple de copier du texte dans le fichier presse-papiers utilisant une animation invisible Flash et un code JavaScript interface.
Le texte à copier est en saisie de texte, par exemple: <input type="text" id="copyText" name="copyText">
et, lorsque vous cliquez sur le bouton ci-dessus, le texte doit être copié dans le presse-papiers. Le bouton ressemble à ceci: <button type="submit" id="copy_button" data-clipboard-target='copyText'>Copy</button>
<script language="JavaScript">
$(document).ready(function() {
var clip = new ZeroClipboard($("#copy_button"), {
moviePath: "ZeroClipboard.swf"
});
});
</script>
Pour les fichiers CDN
note: ZeroClipboard.swf
et ZeroClipboard.js
"devrait se trouver dans le même dossier que votre fichier utilisant cette fonctionnalité est, OR vous devez inclure comme nous incluons <script src=""></script>
dans nos pages.
jQuery solution simple.
Devrait être déclenché par le clic de l'utilisateur.
$("<textarea/>").appendTo("body").val(text).select().each(function () {
document.execCommand('copy');
}).remove();
vous pouvez copier un texte individuel en dehors du texte d'un élément HTML.
var copyToClipboard = function (text) {
var $txt = $('<textarea />');
$txt.val(text)
.css({ width: "1px", height: "1px" })
.appendTo('body');
$txt.select();
if (document.execCommand('copy')) {
$txt.remove();
}
};
Les deux vont comme un charme :),
JAVASCRIPT:
function CopyToClipboard(containerid) {
if (document.selection) {
var range = document.body.createTextRange();
range.moveToElementText(document.getElementById(containerid));
range.select().createTextRange();
document.execCommand("copy");
} else if (window.getSelection) {
var range = document.createRange();
range.selectNode(document.getElementById(containerid));
window.getSelection().addRange(range);
document.execCommand("copy");
alert("text copied")
}}
Aussi en html,
<button id="button1" onclick="CopyToClipboard('div1')">Click to copy</button>
<div id="div1" >Text To Copy </div>
<textarea placeholder="Press ctrl+v to Paste the copied text" rows="5" cols="20"></textarea>
code html ici
<input id="result" style="width:300px"/>some example text
<button onclick="copyToClipboard('result')">Copy P1</button>
<input type="text" style="width:400px" placeholder="Paste here for test" />
JS CODE:
function copyToClipboard(elementId) {
// Create a "hidden" input
var aux = document.createElement("input");
aux.setAttribute("value", document.getElementById(elementId).value);
// Append it to the body
document.body.appendChild(aux);
// Highlight its content
aux.select();
// Copy the highlighted text
document.execCommand("copy");
// Remove it from the body
document.body.removeChild(aux);
}
Clipboard-polyfill library est un polyfill pour l’API presse-papier asynchrone moderne basée sur Promise.
installer dans la CLI:
npm install clipboard-polyfill
importer en tant que presse-papiers dans un fichier JS
window.clipboard = require('clipboard-polyfill');
Je l'utilise dans un paquet avec require("babel-polyfill");
et l'ai testé sur le chrome 67. Tout bon pour la production.
Il est très important que le champ de saisie n'ait pas display: none
. Le navigateur ne sélectionnera pas le texte et ne sera donc pas copié. Utilisez opacity: 0
avec une largeur de 0px pour résoudre le problème.
La plupart des réponses proposées créent un ou plusieurs éléments d’entrée cachés temporaires. Parce que la plupart des navigateurs supportent de nos jours l’édition de contenu div, je propose une solution qui ne crée pas d’élément (s) caché (s), ne conserve pas le formatage du texte et utilise une bibliothèque pure JavaScript ou jQuery.
Voici une implémentation squelette minimaliste utilisant le plus petit nombre de lignes de codes que je pourrais penser:
//Pure javascript implementation:
document.getElementById("copyUsingPureJS").addEventListener("click", function() {
copyUsingPureJS(document.getElementById("copyTarget"));
alert("Text Copied to Clipboard Using Pure Javascript");
});
function copyUsingPureJS(element_id) {
element_id.setAttribute("contentEditable", true);
element_id.setAttribute("onfocus", "document.execCommand('selectAll',false,null)");
element_id.focus();
document.execCommand("copy");
element_id.removeAttribute("contentEditable");
}
//Jquery:
$(document).ready(function() {
$("#copyUsingJquery").click(function() {
copyUsingJquery("#copyTarget");
});
function copyUsingJquery(element_id) {
$(element_id).attr("contenteditable", true)
.select()
.on("focus", function() {
document.execCommand('selectAll', false, null)
})
.focus()
document.execCommand("Copy");
$(element_id).removeAttr("contenteditable");
alert("Text Copied to Clipboard Using jQuery");
}
});
#copyTarget {
width: 400px;
height: 400px;
border: 1px groove gray;
color: navy;
text-align: center;
box-shadow: 0 4px 8px 0 gray;
}
#copyTarget h1 {
color: blue;
}
#copyTarget h2 {
color: red;
}
#copyTarget h3 {
color: green;
}
#copyTarget h4 {
color: cyan;
}
#copyTarget h5 {
color: brown;
}
#copyTarget h6 {
color: teal;
}
#pasteTarget {
width: 400px;
height: 400px;
border: 1px inset skyblue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="copyTarget">
<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<h4>Heading 4</h4>
<h5>Heading 5</h5>
<h6>Heading 6</h6>
<strong>Preserve <em>formatting</em></strong>
<br/>
</div>
<button id="copyUsingPureJS">Copy Using Pure JavaScript</button>
<button id="copyUsingJquery">Copy Using jQuery</button>
<br><br> Paste Here to See Result
<div id="pasteTarget" contenteditable="true"></div>