Quelle est la meilleure façon de copier du texte dans le presse-papiers? (multi-navigateur)
J'ai essayé:
function copyToClipboard(text) {
if (window.clipboardData) { // Internet Explorer
window.clipboardData.setData("Text", text);
} else {
unsafeWindow.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
const clipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
clipboardHelper.copyString(text);
}
}
mais dans Internet Explorer, il donne une erreur de syntaxe. Dans Firefox, c'est écrit unsafeWindow is not defined
.
Une bonne astuce sans flash: comment Trello accède-t-il au presse-papiers de l'utilisateur?
javascript
clipboard
copy-paste
Santiago Corredoira
la source
la source
Réponses:
Aperçu
Il existe trois API de navigateur principales pour la copie dans le presse-papiers:
[navigator.clipboard.writeText]
document.execCommand('copy')
Notes générales de développement
Ne vous attendez pas à ce que les commandes liées au presse-papiers fonctionnent pendant que vous testez du code dans la console. Généralement, la page doit être active (API Async Clipboard) ou nécessite une interaction de l'utilisateur (par exemple un clic de l'utilisateur) pour permettre à (
document.execCommand('copy')
) d'accéder au presse-papiers, voir ci-dessous pour plus de détails.IMPORTANT (noté ici 2020/02/20)
Notez que puisque cette publication a été rédigée à l'origine, la dépréciation des autorisations dans les IFRAME d'origine croisée et d'autres "sandboxing" IFRAME empêche les boutons de démonstration intégrés "Exécuter un extrait de code" et "l'exemple codepen.io" de fonctionner dans certains navigateurs (y compris Chrome et Microsoft Edge). ).
Pour développer, créez votre propre page Web, servez-vous de cette page via une connexion HTTPS pour tester et développer.
Voici une page de test / démo qui montre le fonctionnement du code: https://deanmarktaylor.github.io/clipboard-test/
Async + Fallback
En raison du niveau de prise en charge du navigateur pour la nouvelle API Async Clipboard, vous souhaiterez probablement recourir à la
document.execCommand('copy')
méthode pour obtenir une bonne couverture du navigateur.Voici un exemple simple (peut ne pas fonctionner intégré dans ce site, lisez la note "importante" ci-dessus):
(l'exemple codepen.io peut ne pas fonctionner, lisez la note "importante" ci-dessus) Notez que cet extrait ne fonctionne pas bien dans l'aperçu intégré de Stack Overflow, vous pouvez l'essayer ici: https://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011
API Async Clipboard
Notez qu'il est possible de "demander l'autorisation" et de tester l'accès au presse-papiers via l'API d'autorisations dans Chrome 66.
document.execCommand ('copie')
Le reste de cet article va dans les nuances et les détails de l'
document.execCommand('copy')
API.Prise en charge du navigateur
Le
document.execCommand('copy')
support JavaScript a grandi, voir les liens ci-dessous pour les mises à jour du navigateur:Exemple simple
(peut ne pas fonctionner intégré dans ce site, lisez la note "importante" ci-dessus)
Exemple complexe: copier dans le presse-papiers sans afficher d'entrée
L'exemple simple ci-dessus fonctionne très bien si un élément
textarea
ouinput
est visible à l'écran.Dans certains cas, vous souhaiterez peut-être copier du texte dans le presse-papiers sans afficher d' élément
input
/textarea
. Voici un exemple de méthode pour contourner ce problème (essentiellement insérer un élément, copier dans le presse-papiers, supprimer un élément):Testé avec Google Chrome 44, Firefox 42.0a1 et Internet Explorer 11.0.8600.17814.
(peut ne pas fonctionner intégré dans ce site, lisez la note "importante" ci-dessus)
Notes complémentaires
Fonctionne uniquement si l'utilisateur effectue une action
Tous les
document.execCommand('copy')
appels doivent être le résultat direct d'une action de l'utilisateur, par exemple un gestionnaire d'événements de clic. Il s'agit d'une mesure pour éviter de jouer avec le presse-papiers de l'utilisateur lorsqu'il ne s'y attend pas.Consultez le post des développeurs Google ici pour plus d'informations.
API Clipboard
Notez que le projet de spécification complet de l'API Clipboard se trouve ici: https://w3c.github.io/clipboard-apis/
Est-il pris en charge?
document.queryCommandSupported('copy')
doit retournertrue
si la commande "est prise en charge par le navigateur".document.queryCommandEnabled('copy')
revenirtrue
si ledocument.execCommand('copy')
réussit si appelé maintenant. Vérification pour vous assurer que la commande a été appelée à partir d'un thread initié par l'utilisateur et que d'autres exigences sont remplies.Cependant , comme un exemple de problèmes de compatibilité du navigateur, Google Chrome de ~ Avril à Octobre 2015 , ne ~ retour
true
dedocument.queryCommandSupported('copy')
si la commande a été appelé à partir d' un fil lancé par l' utilisateur.Notez les détails de compatibilité ci-dessous.
Détails de compatibilité du navigateur
Bien qu'un simple appel à
document.execCommand('copy')
enveloppé dans un bloctry
/catch
appelé à la suite d'un clic de l'utilisateur vous obtienne le plus de compatibilité, ce qui suit a certaines conditions:Tout appel à
document.execCommand
,document.queryCommandSupported
oudocument.queryCommandEnabled
doit être encapsulé dans un bloctry
/catch
.Différentes implémentations et versions de navigateur lancent différents types d'exceptions lorsqu'elles sont appelées au lieu de revenir
false
.Différentes implémentations de navigateur sont toujours en cours et l' API Clipboard est toujours en projet, alors n'oubliez pas de faire vos tests.
la source
var str = "word";
?<textarea>
avec JS, ajoutez-le àdocument.body
, définissez sa valeur sur la variable et utilisez-le à la vitesse decopyTextarea
, puis supprimez-le juste après la copie du contenu.La copie automatique dans le presse-papiers peut être dangereuse, donc la plupart des navigateurs (sauf IE) rendent la tâche très difficile. Personnellement, j'utilise l'astuce simple suivante:
L'utilisateur est présenté avec la boîte d'invite, où le texte à copier est déjà sélectionné. Il suffit maintenant d'appuyer sur Ctrl+ Cet Enter(pour fermer la boîte) - et le tour est joué!
Maintenant, l'opération de copie du presse-papiers est SÉCURITAIRE, car l'utilisateur le fait manuellement (mais d'une manière assez simple). Bien sûr, fonctionne dans tous les navigateurs.
la source
L'approche suivante fonctionne dans Chrome, Firefox, Internet Explorer et Edge, et dans les versions récentes de Safari (le support de copie a été ajouté dans la version 10 qui a été publiée en octobre 2016).
Remarque: vous ne verrez pas la zone de texte, car elle est ajoutée et supprimée dans le même appel synchrone de code Javascript.
Certaines choses à surveiller si vous implémentez cela vous-même:
La fonction ci-dessous doit gérer tous les problèmes suivants aussi proprement que possible. Veuillez laisser un commentaire si vous rencontrez des problèmes ou avez des suggestions pour l'améliorer.
https://jsfiddle.net/fx6a6n6x/
la source
Voici mon point de vue sur celui-là ...
@korayem: Notez que l'utilisation du
input
champ html ne respectera pas les sauts de ligne\n
et aplatira tout texte en une seule ligne.Comme mentionné par @nikksan dans les commentaires, l'utilisation résoudra
textarea
le problème comme suit:la source
\n
?\r\n
pour un saut de ligneSi vous voulez une solution vraiment simple (prend moins de 5 minutes à intégrer) et semble bonne dès la sortie de la boîte, alors Clippy est une belle alternative à certaines des solutions les plus complexes.
Il a été écrit par un co-fondateur de GitHub. Exemple de code d'intégration Flash ci-dessous:
N'oubliez pas de remplacer
#{text}
par le texte à copier et#{bgcolor}
par une couleur.la source
La lecture et la modification du presse-papiers à partir d'une page Web soulèvent des problèmes de sécurité et de confidentialité. Cependant, dans Internet Explorer, il est possible de le faire. J'ai trouvé cet exemple d'extrait :
la source
execCommand(\\’copy\\’);
fait, sinon copier dans le presse-papiers pour IE? @mrBornaif(!document.all)
mais deif(!r.execCommand)
peur que quelqu'un d'autre ne le mette en œuvre! Document.all n'est absolument pas pertinent pour cela.J'ai récemment écrit un blog technique sur ce problème (je travaille chez Lucidchart et nous avons récemment fait une refonte sur notre presse-papiers).
La copie de texte brut dans le presse-papiers est relativement simple, en supposant que vous vouliez le faire pendant un événement de copie système (l'utilisateur appuie CtrlCou utilise le menu du navigateur).
Il est beaucoup plus difficile de placer du texte dans le presse-papiers pendant un événement de copie système. Il semble que certaines de ces autres réponses fassent référence à des façons de le faire via Flash, qui est la seule façon multi-navigateur de le faire (pour autant que je comprends).
En dehors de cela, il existe certaines options navigateur par navigateur.
C'est le plus simple dans IE, où vous pouvez accéder à tout moment à l'objet clipboardData à partir de JavaScript via:
(Toutefois, lorsque vous tentez d'effectuer cette opération en dehors d'un événement de coupure, de copie ou de collage système, IE invite l'utilisateur à accorder l'autorisation au presse-papiers de l'application Web.)
Dans Chrome, vous pouvez créer une extension Chrome qui vous donnera des autorisations de presse-papiers (c'est ce que nous faisons pour Lucidchart). Ensuite, pour les utilisateurs avec votre extension installée, vous aurez juste besoin de déclencher l'événement système vous-même:
Il semble que Firefox dispose de certaines options qui permettent aux utilisateurs d'accorder des autorisations à certains sites pour accéder au presse-papiers, mais je n'ai essayé aucune de ces options personnellement.
la source
clipboard.js est un petit utilitaire non Flash qui permet de copier du texte ou des données HTML dans le presse-papiers. C'est très facile à utiliser, il suffit d'inclure le .js et d'utiliser quelque chose comme ceci:
clipboard.js est également sur GitHub .
la source
ZeroClipboard est la meilleure solution multi-navigateur que j'ai trouvée:
Si vous avez besoin d'une prise en charge non flash pour iOS, il vous suffit d'ajouter une solution de secours:
http://zeroclipboard.org/
https://github.com/zeroclipboard/ZeroClipboard
la source
src
dans les balises de script). Je pense que leur documentation est jolie mais inefficace.En 2018, voici comment vous y prendre:
Il est utilisé dans mon code Angular 6+ comme ceci:
Si je passe une chaîne, il la copie. Si rien, il copie l'URL de la page.
On peut aussi faire plus de gymnastique dans le presse-papiers. Voir plus d'informations ici:
Débloquer l'accès au presse-papiers
la source
À partir d'un des projets sur lesquels j'ai travaillé, un plugin de copie vers presse-papiers jQuery qui utilise la bibliothèque Zero Clipboard .
Il est plus facile à utiliser que le plugin natif Zero Clipboard si vous êtes un gros utilisateur de jQuery.
la source
text()
place deinnerHTML()
si vous le souhaitez ..innerHTML
est compatible avec plusieurs navigateurs depuis longtemps. Tout simplement parce que Microsoft a eu l'idée à l'origine de ne pas la rendre non fiable ou propriétaire. Il est également maintenant enfin être ajouté à la spécification officielle (après tous les principaux fournisseurs de navigateur déjà ajouté le support pour elle ... soupir ).92KB
est vraiment grand. Jusqu'à ce que le LTE arrive à maturité, GPRS est la norme de données mobiles WW , et il commence à1 KB/s
. Faites le calcul vous-même.Depuis Chrome 42+ et Firefox 41+ prennent désormais en charge la commande document.execCommand ('copy') . J'ai donc créé deux fonctions pour une capacité copie à presse - papiers multi-navigateur utilisant une combinaison de vieille réponse de Tim vers le bas et la réponse de Google Developer :
la source
J'utilise cela avec beaucoup de succès ( sans jQuery ou tout autre framework).
Attention
Les tabulations sont converties en espaces (au moins dans Chrome).
la source
J'ai trouvé la solution suivante:
Le gestionnaire de touches enfoncées crée une balise "pre". Nous définissons le contenu à copier dans cette balise, puis faisons une sélection sur cette balise et retournons true dans le gestionnaire. Cela appelle un gestionnaire standard de chrome et copie le texte sélectionné.
Et si vous en avez besoin, vous pouvez définir le délai d'expiration pour la fonction de restauration de la sélection précédente. Mon implémentation sur Mootools:
Usage:
Sur coller, il crée une zone de texte et fonctionne de la même manière.
PS peut être cette solution peut être utilisée pour créer une solution entièrement multi-navigateur sans flash. Ses œuvres en FF et Chrome.
la source
Les autres méthodes copient du texte brut dans le presse-papiers. Pour copier HTML (c'est-à-dire que vous pouvez coller les résultats dans un éditeur WSIWYG), vous pouvez effectuer les opérations suivantes dans IE UNIQUEMENT . Ceci est fondamentalement différent des autres méthodes, car le navigateur sélectionne en fait visiblement le contenu.
la source
J'ai rassemblé ce que je pense être le meilleur.
C'est ici:
Usage:
copyToClipboard('some text')
la source
Depuis Flash 10, vous ne pouvez copier dans le presse-papiers que si l'action provient d'une interaction de l'utilisateur avec un objet Flash. ( Lire la section connexe de l'annonce d'Adobe Flash 10 )
La solution est de surcharger un objet flash au-dessus du bouton Copier, ou tout élément qui lance la copie. Zero Clipboard est actuellement la meilleure bibliothèque avec cette implémentation. Les développeurs Flash expérimentés peuvent simplement vouloir créer leur propre bibliothèque.
la source
la source
J'ai trouvé la solution suivante:
J'ai le texte dans une entrée cachée. Étant donné que
setSelectionRange
cela ne fonctionne pas sur les entrées masquées, j'ai temporairement changé le type en texte, copié le texte, puis rendu à nouveau masqué. Si vous souhaitez copier le texte d'un élément, vous pouvez le passer à la fonction et enregistrer son contenu dans la variable cible.la source
Copiez le texte de l'entrée HTML dans le presse-papiers:
Remarque: La
document.execCommand()
méthode n'est pas prise en charge dans Internet Explorer 9 et versions antérieures.Source : W3Schools - Copier du texte dans le presse-papiers
la source
Il existe déjà de nombreuses réponses, mais vous souhaitez en ajouter une (jQuery). Fonctionne très bien sur n'importe quel navigateur, également mobile (c'est-à-dire, les invites sur la sécurité, mais lorsque vous l'acceptez, cela fonctionne très bien).
Dans votre code:
la source
C'est un peu une combinaison entre les autres réponses.
Il utilise jQuery, mais ce n'est pas obligatoire bien sûr. Vous pouvez changer cela si vous le souhaitez. Je viens d'avoir jQuery à ma disposition. Vous pouvez également ajouter du CSS pour vous assurer que l'entrée ne s'affiche pas. Par exemple quelque chose comme:
Ou bien sûr, vous pouvez également faire un style en ligne
la source
textToCopy
contient\n
Dans les navigateurs autres que IE, vous devez utiliser un petit objet flash pour manipuler le presse-papiers, par exemple
la source
J'ai eu le même problème pour créer une modification de grille personnalisée à partir (quelque chose comme Excel) et la compatibilité avec Excel. Je devais prendre en charge la sélection de plusieurs cellules, la copie et le collage.
Solution: créez une zone de texte dans laquelle vous allez insérer des données à copier par l'utilisateur (pour moi lorsque l'utilisateur sélectionne des cellules), placez-y le focus (par exemple, lorsque l'utilisateur appuie sur Ctrl) et sélectionnez tout le texte.
Ainsi, lorsque l'utilisateur appuie sur Ctrl+ Cil obtient des cellules copiées qu'il / elle sélectionne. Après avoir testé, il suffit de redimensionner la zone de texte à un pixel (je n'ai pas testé si cela fonctionnera à l'écran: aucun). Cela fonctionne bien sur tous les navigateurs et il est transparent pour l'utilisateur.
Coller - vous pouvez faire la même chose comme cela (diffère selon votre cible) - garder le focus sur les zones de texte et attraper les événements de collage en utilisant onpaste (dans mon projet, j'utilise des zones de texte dans les cellules pour les modifier).
Je ne peux pas coller d'exemple (projet commercial), mais vous avez l'idée.
la source
J'ai utilisé clipboard.js.
Nous pouvons l'obtenir sur npm:
Et aussi sur Bower
L'utilisation et les exemples se trouvent sur https://zenorocha.github.io/clipboard.js/ .
la source
Il s'agit d'une extension de la réponse de @ Chase, avec l'avantage qu'elle fonctionnera pour les éléments IMAGE et TABLE, pas seulement pour les DIV sur IE9.
la source
Il semble que j'ai mal lu la question, mais pour référence, vous pouvez extraire une plage du DOM (pas dans le presse-papiers; compatible avec tous les navigateurs modernes), et le combiner avec les événements oncopy et onpaste et onbeforepaste pour obtenir le comportement du presse-papiers. Voici le code pour y parvenir:
la source
Ma faute. Cela ne fonctionne que dans IE.
Voici encore une autre façon de copier du texte:
la source
C'est la seule chose que j'ai jamais mise au travail, après avoir recherché diverses manières sur Internet. C'est un sujet compliqué. Il existe de nombreuses solutions publiées dans le monde et la plupart d'entre elles ne fonctionnent pas . Cela a fonctionné pour moi:
REMARQUE: ce code ne fonctionnera que lorsqu'il sera exécuté en tant que code synchrone direct vers quelque chose comme une méthode «onClick». Si vous appelez une réponse asynchrone à Ajax ou de toute autre manière asynchrone, cela ne fonctionnera pas.
Je me rends compte que ce code affichera un composant de 1 pixel de large visiblement à l'écran pendant une milliseconde, mais j'ai décidé de ne pas vous en soucier, ce que d'autres peuvent résoudre en cas de problème réel.
la source
Pour copier un texte sélectionné («Texte à copier») dans votre presse-papiers, créez un Bookmarklet (signet du navigateur qui exécute JavaScript) et exécutez-le (cliquez dessus). Cela créera une zone de texte temporaire.
Code de GitHub:
https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d
la source