Copia / metti il ​​testo negli appunti con FireFox, Safari e Chrome


113

In Internet Explorer posso utilizzare l'oggetto clipboardData per accedere agli appunti. Come posso farlo in FireFox, Safari e / o Chrome?


Se si vuole fare questo in cromo console, è possibile utilizzare copy, developer.chrome.com/devtools/docs/commandline-api
Wener


1
@ bjb568, la domanda che hai menzionato è stata inserita in un secondo momento, quindi è il duplicato
GvS

@GvS Non si tratta sempre di quale sia pubblicato per primo. L'altro era più popolare e ha ottenuto più risposte. Se lo desideri, contrassegnalo in modo che un moderatore possa unire le domande.
bjb568

Risposta ben documentato in stackoverflow.com/a/30810322/712334
Josh Habdas

Risposte:


21

Ora c'è un modo per farlo facilmente nella maggior parte dei browser moderni utilizzando

document.execCommand('copy');

Questo copierà il testo attualmente selezionato. È possibile selezionare una textArea o un campo di input utilizzando

document.getElementById('myText').select();

Per copiare il testo in modo invisibile è possibile generare rapidamente una textArea, modificare il testo nella casella, selezionarlo, copiarlo e quindi eliminare textArea. Nella maggior parte dei casi questo textArea non lampeggia nemmeno sullo schermo.

Per motivi di sicurezza, i browser ti permetteranno di copiare solo se un utente esegue un qualche tipo di azione (ad esempio, facendo clic su un pulsante). Un modo per farlo sarebbe aggiungere un evento onClick a un pulsante html che chiama un metodo che copia il testo.

Un esempio completo:

function copier(){
  document.getElementById('myText').select();
  document.execCommand('copy');
}
<button onclick="copier()">Copy</button>
<textarea id="myText">Copy me PLEASE!!!</textarea>


50

Per motivi di sicurezza, Firefox non consente di inserire testo negli appunti. Tuttavia, è disponibile una soluzione alternativa utilizzando Flash.

function copyIntoClipboard(text) {

    var flashId = 'flashId-HKxmj5';

    /* Replace this with your clipboard.swf location */
    var clipboardSWF = 'http://appengine.bravo9.com/copy-into-clipboard/clipboard.swf';

    if(!document.getElementById(flashId)) {
        var div = document.createElement('div');
        div.id = flashId;
        document.body.appendChild(div);
    }
    document.getElementById(flashId).innerHTML = '';
    var content = '<embed src="' + 
        clipboardSWF +
        '" FlashVars="clipboard=' + encodeURIComponent(text) +
        '" width="0" height="0" type="application/x-shockwave-flash"></embed>';
    document.getElementById(flashId).innerHTML = content;
}

L'unico svantaggio è che questo richiede che Flash sia abilitato.

la fonte è attualmente morta: http://bravo9.com/journal/copying-text-into-the-clipboard-with-javascript-in-firefox-safari-ie-opera-292559a2-cc6c-4ebf-9724-d23e8bc5ad8a/ ( e così è la cache di Google )


17
Un terzo svantaggio è che non funzionerà localmente (file: //) senza modificare i permessi su flash. code.google.com/p/zeroclipboard è una libreria costruita attorno a questo metodo.
Regis Frey

@ b1naryatr0phy: Vero per la maggior parte, ma HTML5 non ha ancora un sostituto per la funzionalità degli appunti attualmente offerta da Flash (ad esempio utilizzando ZeroClipboard).
James M. Greene

3
A partire dal 2014, questo metodo non funziona più in nessun browser moderno. ZeroClipboard è l'unica tecnologia che attualmente risolve questo problema
Cozzamara

A partire da settembre 2015, Flash sta morendo di una morte relativamente rapida e ZeroClipboard si basa sul suo utilizzo. Vedere la mia risposta di seguito da agosto 2015 per una soluzione che non utilizza Flash.
un programmatore


10

È l'estate 2015 e con così tanto tumulto che circonda Flash ho pensato di aggiungere una nuova risposta a questa domanda che ne evita del tutto l'uso.

clipboard.js è una bella utility che permette di copiare testo o dati html negli appunti. È molto facile da usare, basta includere il .js e usare qualcosa del genere:

<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 è anche su GitHub


1
Il primo collegamento che fornisci (a npmjs.com) dice che non funziona con IE, ma funziona (come in realtà dice su GitHub)
gordon613

9

Nel 2017 puoi farlo (dicendo questo perché questo thread ha quasi 9 anni!)

function copyStringToClipboard (string) {
    function handler (event){
        event.clipboardData.setData('text/plain', string);
        event.preventDefault();
        document.removeEventListener('copy', handler, true);
    }

    document.addEventListener('copy', handler, true);
    document.execCommand('copy');
}

E ora da copiare copyStringToClipboard('Hello World')

Se hai notato la setDatalinea e ti sei chiesto se puoi impostare diversi tipi di dati, la risposta è sì.


per safari avevo bisogno di eseguire un .select()su una casella di input prima di chiamarlo.
Chad Scira

Dovresti rimuovere anche il listener di eventi?
Chris Walsh

1
@ChrisWalsh Sì, è fatto all'interno del gestore nell'esempio di codice. Il motivo è che altrimenti il ​​gestore sarà ancora in memoria.
Spoike

8

Firefox consente di memorizzare i dati negli appunti, ma a causa di implicazioni per la sicurezza è disabilitato per impostazione predefinita. Scopri come abilitarlo in "Concessione dell'accesso JavaScript agli appunti" nella knowledge base di Mozilla Firefox.

La soluzione offerta da amdfan è la migliore se hai molti utenti e la configurazione del loro browser non è un'opzione. Sebbene sia possibile verificare se gli appunti sono disponibili e fornire un collegamento per modificare le impostazioni, se gli utenti sono esperti di tecnologia. L'editor JavaScript TinyMCE segue questo approccio.



4

Devo dire che nessuna di queste soluzioni davvero funziona . Ho provato la soluzione degli appunti dalla risposta accettata e non funziona con Flash Player 10. Ho anche provato ZeroClipboard e per un po 'ne sono rimasto molto soddisfatto.

Attualmente lo sto utilizzando sul mio sito ( http://www.blogtrog.com ), ma ho notato strani bug con esso. Il modo in cui funziona ZeroClipboard è che mette un oggetto flash invisibile sopra un elemento della tua pagina. Ho scoperto che se il mio elemento si sposta (come quando l'utente ridimensiona la finestra e ho le cose allineate correttamente), l'oggetto flash ZeroClipboard esce di botto e non copre più l'oggetto. Sospetto che probabilmente sia ancora seduto dov'era originariamente. Hanno un codice che dovrebbe fermarlo o rimetterlo nell'elemento, ma non sembra funzionare bene.

Quindi ... nella prossima versione di BlogTrog, immagino che seguirò l'esempio con tutti gli altri evidenziatori di codice che ho visto in circolazione e rimuoverò il mio pulsante Copia negli Appunti. :-(

(Ho notato che anche la copia negli Appunti di dp.syntaxhiglighter è interrotta.)


3
È triste quando la funzionalità deve fare un passo indietro in nome della sicurezza. Vorrei davvero che ci fosse una soluzione che fosse al tempo stesso sicura e che consentisse comunque l'accesso agli appunti da una pagina web, anche se l'utente deve concedergli l'autorizzazione esplicita una volta o qualcosa.
devios1

Questo è ciò che IE fa per impostazione predefinita
Matthew Lock

3

domanda troppo vecchia ma non ho visto questa risposta da nessuna parte ...

Controlla questo link:

http://kb.mozillazine.org/Granting_JavaScript_access_to_the_clipboard

come tutti hanno detto, per motivi di sicurezza è disabilitato di default. il collegamento sopra mostra le istruzioni su come abilitarlo (modificando about: config in firefox o user.js).

Fortunatamente esiste un plugin chiamato "AllowClipboardHelper" che semplifica le cose con pochi clic. tuttavia devi comunque istruire i visitatori del tuo sito web su come abilitare l'accesso in Firefox.


Non pensi che ci sia qualcosa di simile per Chrome / WebKit?
devios1

3

Usa il moderno document.execCommand ("copy") e jQuery. Vedi questa risposta di stackoverflow

var ClipboardHelper = { // as Object

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();
}};

Come chiamare:

 ClipboardHelper.copyText('Hello\nWorld');
 ClipboardHelper.copyElement($('body h1').first());

// JQUERY DOCUMENT
;(function ( $, window, document, undefined ) {
  
  var ClipboardHelper = {

    copyElement: function ($element)
    {
       this.copyText($element.text())
    },
    copyText:function(text) // Linebreaks with \n
    {
        var $tempInput =  $("<textarea>");
        $("body").append($tempInput);
      
        //todo prepare Text: remove double whitespaces, trim
        
        $tempInput.val(text).select();
        document.execCommand("copy");
        $tempInput.remove();
    }
};

    $(document).ready(function()
    {
         var $body=$('body');
         
        $body.on('click', '*[data-copy-text-to-clipboard]', function(event) 
        {
            var $btn=$(this);
            var text=$btn.attr('data-copy-text-to-clipboard');
            ClipboardHelper.copyText(text);
        });
      
        $body.on('click', '.js-copy-element-to-clipboard', function(event) 
        {
            ClipboardHelper.copyElement($(this));
        });

    });


})( jQuery, window, document );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<span data-copy-text-to-clipboard=
"Hello
 World">
  Copy Text
</span>
<br><br>
<span class="js-copy-element-to-clipboard">
Hello
World 
Element
</span>


2

Ho usato Clippy di Github per le mie esigenze, semplice pulsante basato su Flash. Funziona bene, se uno non ha bisogno di uno stile ed è soddisfatto di inserire in anticipo cosa incollare sul lato server.


1

Un leggero miglioramento della soluzione Flash consiste nel rilevare per Flash 10 utilizzando swfobject:

http://code.google.com/p/swfobject/

e quindi se viene visualizzato come flash 10, prova a caricare un oggetto Shockwave usando javascript. Shockwave può leggere / scrivere negli appunti (in tutte le versioni) anche utilizzando il comando copyToClipboard () in gergo.


1

http://www.rodsdot.com/ee/cross_browser_clipboard_copy_with_pop_over_message.asp funziona con Flash 10 e tutti i browser abilitati per Flash.

Anche ZeroClipboard è stato aggiornato per evitare il bug menzionato sullo scorrimento della pagina che causava il non essere più nella posizione corretta del filmato Flash.

Poiché tale metodo "richiede" all'utente di fare clic su un pulsante per copiare, ciò è una comodità per l'utente e non sta accadendo nulla di nefasto.


1

prova a creare una variabile globale di memoria che memorizza la selezione, quindi l'altra funzione può accedere alla variabile e fare un incolla per esempio ..

var memory = '';//outside the functions but within the script tag.

function moz_stringCopy(DOMEle,firstPos,secondPos) {

var copiedString = DOMEle.value.slice(firstPos, secondPos);
memory = copiedString;

}

function moz_stringPaste(DOMEle, newpos) {

    DOMEle.value = DOMEle.value.slice(0,newpos) + memory + DOMEle.value.slice(newpos);

}

3
potrebbe copiare da qualsiasi altra parte non considerando solo all'interno della pagina
Marwan

1

Se supporti il ​​flash puoi utilizzare https://everyplay.com/assets/clipboard.swf e utilizzare il testo flashvars per impostare il testo

https://everyplay.com/assets/clipboard.swf?text=It%20Works

Questo è quello che uso per copiare e puoi impostare come extra se non supporta queste opzioni puoi usare:

Per Internet Explorer: window.clipboardData.setData (DataFormat, Text) e window.clipboardData.getData (DataFormat)

È possibile utilizzare Text e Url di DataFormat per getData e setData.

E per eliminare i dati:

È possibile utilizzare File, HTML, Immagine, Testo e URL di DataFormat. PS: è necessario utilizzare window.clipboardData.clearData (DataFormat);

E per altri che non supportano window.clipboardData e file flash swf puoi anche usare il tasto control + c sulla tastiera per Windows e per mac il suo comando + c



1

Usa document.execCommand('copy'). Supportato nelle ultime versioni di Chrome, Firefox, Edgee Safari.

function copyText(text){
  function selectElementText(element) {
    if (document.selection) {
      var range = document.body.createTextRange();
      range.moveToElementText(element);
      range.select();
    } else if (window.getSelection) {
      var range = document.createRange();
      range.selectNode(element);
      window.getSelection().removeAllRanges();
      window.getSelection().addRange(range);
    }
  }
  var element = document.createElement('DIV');
  element.textContent = text;
  document.body.appendChild(element);
  selectElementText(element);
  document.execCommand('copy');
  element.remove();
}


var txt = document.getElementById('txt');
var btn = document.getElementById('btn');
btn.addEventListener('click', function(){
  copyText(txt.value);
})
<input id="txt" value="Hello World!" />
<button id="btn">Copy To Clipboard</button>


1

L'API degli Appunti è progettata per sostituire document.execCommand. Safari sta ancora lavorando al supporto, quindi dovresti fornire un fallback fino a quando le specifiche non si stabiliscono e Safari termina l'implementazione.

const permalink = document.querySelector('[rel="bookmark"]');
const output = document.querySelector('output');
permalink.onclick = evt => {
  evt.preventDefault();
  window.navigator.clipboard.writeText(
    permalink.href
  ).then(() => {
    output.textContent = 'Copied';
  }, () => {
    output.textContent = 'Not copied';
  });
};
<a href="/programming/127040/" rel="bookmark">Permalink</a>
<output></output>

Per motivi di sicurezza Permissionspotrebbe essere necessario leggere e scrivere appunti dagli appunti. Se lo snippet non funziona su SO, provalo su localhostun dominio altrimenti affidabile.


1

Basandosi sull'eccellente risposta di @David di Studio.201, funziona in Safari, FF e Chrome. Assicura inoltre che non si verifichi alcun lampeggiamento textareaposizionandolo fuori dallo schermo.

// ================================================================================
// ClipboardClass
// ================================================================================
var ClipboardClass = (function() {


   function copyText(text) {
    // Create temp element off-screen to hold text.
        var tempElem = $('<textarea style="position: absolute; top: -8888px; left: -8888px">');
        $("body").append(tempElem);

        tempElem.val(text).select();
        document.execCommand("copy");
        tempElem.remove();
   }


    // ============================================================================
   // Class API
   // ============================================================================
    return {
        copyText: copyText
    };
})();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.