back to top

Copiare testo negli appunti con Javascript

Inserire un pulsante per copiare porzioni di testo presenti in una pagina Web negli appunti del proprio sistema è un’operazione relativamente semplice, soprattutto ora che il metodo JavaScript execCommand() è supportato dalla maggior parte dei browser Internet più utilizzati. Vedremo quindi a cosa serve questo costrutto e come utilizzarlo per i nostri progetti.

Copiare negli appunti in puro Javascript

In pratica execCommand() è un metodo che consente di attivare delle istruzioni per la manipolazione dei contenuti di un’area o componente di pagina editabile; queste istruzioni possono coinvolgere un elemento selezionato, ad esempio una stringa delimitata da tag, inserire un ulteriore elemento, ad esempio un link, o isolare un’intera linea di codice sulla base della sua indentazione.

E’ possibile utilizzare execCommand() in associazione con diversi metodi, nel caso del nostro script faremo riferimento a querySelector()che ha il compito di restituire il primo elemento che corrisponde ad uno specifico selettore CSS; si differenzia quindi da querySelectorAll() che invece restituisce tutti gli elementi che corrispondono ad un determinato selettore.

Partiremo quindi con la creazione di una semplice pagina HTML contenete un campo di input e il pulsante per attivare il comando di copia:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Copiare un testo negli appunti con JavaScript</title>
</head>
<body>
<div class="myinput">
<h1>Premi il pulsante e copia il testo</h1>
<input type="text" id="testo-da-copiare" value="Blah! Blah! Blah!"/>
<input type="button" id="pulsante-da-premere" value="Copia negli appunti">
</div>
</body>
</html>

Ora passiamo al codice JavaScript:

document.querySelector("#pulsante-da-premere").onclick = function() {
  // selezione del contenuto
  document.querySelector("#testo-da-copiare").select();
  // copia negli appunti
  document.execCommand('copy');
};

In sostanza il comando copy() ha il compito di copiare la selezione corrente (cioè quella che nel nostro esempio viene identificata dal metodo querySelector()) negli appunti del sistema utilizzato. In alternativa è possibile utilizzare anche cut(), un comando che oltre a copiare la porzione di contenuto selezionata la taglia, esattamente come accade con il menù contestuale attivato dal tasto destro del mouse.

Attenzione: affinché lo script funzioni correttamente è necessario inserirlo subito prima della chiusura del tag body.

Utilizzare ZeroClipboard

Come abbiamo appena visto la fuznione copy to clipboard (in italiano: copia negli appunti) può essere realizzata con un po’ di Javascript tuttavia, a causa delle impostazioni di sicurezza di alcuni browser, non ne è sempre garantita una piena funzionalità. Al fine di ovviare a questo inconveniente è possibile ricorrere a delle librerie ad hoc come, ad esempio, ZeroClipboard. Quest’ultima riesce a bypassare i sopracitati problemi facendo ricorso ad un geniale miscuglio di Javascript e Flash.

Per implementare la funzionalità di "copia negli appunti" è necessario, ovviamente, scaricare la libreria ed includerla nella pagina web.

<script type="text/javascript" src="ZeroClipboard.js"></script>

Fatto questo si predisponga una textarea contenente il testo da copiare:

<textarea name="copiami" id="copiami" rows="5" cols="70">
Questo è il testo da copiare...
</textarea>
<p><input type="button" id="copiatesto" name="copiatesto" value="Copy to Clipboard" /></p>

e si accodi questo codice javascript:

<script>
// definisco la URL del file SWF
ZeroClipboard.setMoviePath('http://www.miosito.com/ZeroClipboard.swf');

var clip = new ZeroClipboard.Client();
clip.addEventListener('mousedown',function() {
  clip.setText(document.getElementById('copiami').value);
});
clip.addEventListener('complete',function(client,text) {
  alert('copiato:\n\n' + text);
});

// attivo la funzione al click sul bottone con ID "copiatesto"
clip.glue('copiatesto');
</script>

Il gioco è fatto. A questa pagina potete vedere una demo funzionante.

Utilizzare Clipboard.js

clipboard.js è una libreria realizzata in linguaggio JavaScript e concepita per offrire un approccio più moderno alla gestione delle porzioni di testo copiate negli appunti; l’utilizzatore di questa soluzione verrà avvantaggiato dal suo peso quasi irrilevante, parliamo di appena 2Kb, caratteristica che ne semplificherà enormemente l’integrazione all’interno di una qualsiasi Web application o di un sito Internet.

A differenza di ZeroClipboard, questa libreria non utilizza componenti Flash o altri sistemi "non standard" ma implementa tutto in puro Javascript, garantendo quindi la massima compatibilità cross-browser.

Rilasciato sotto licenza Open Source e quindi liberamente adattabile sulla base delle esigenze legate al proprio progetto, clipboard.js potrà essere scaricato facilmente utilizzando comuni pakage manager come npm e bower, in alternativa si potrà effettuare il download dell’archivio compresso in formato Zip linkato sull’home page del sito ufficiale; fatto questo, il file ".js" necessario per l’accesso alle funzionalità sarà presente nella cartella dist e si potrà quindi procedere con la sua inclusione:

<script src="dist/clipboard.min.js"></script>

La libreria dovrà essere inizializzata tramite istanza utilizzando un selettore del DOM (Document Object Model), come mostrato attraverso nella seguente istruzione:

new Clipboard('.btn');

Ora non resterà che specificare l’elemento associato al selettore che, nel caso specifico del nostro esempio, sarà un normale button con relativa regola di stile:

<button class="btn">

clipboard.js sfrutta gli attributi per i dati di HTML5, si potrà per esempio utilizzare l’attributo data-clipboard-target per definire sia l’elemento sorgente della risorsa da copiare che quello destinato alla sua gestione; per fare un esempio, questo potrebbe essere l’elemento (un campo di input) dal quale copiare una determinata stringa (target) che, nel caso specifico, è un URL:

<input id="blah" value="https://www.mrwebmaster.it">

mentre l’elemento per la gestione del testo copiato potrebbe essere il pulsante (trigger) qui definito:

<button class="btn" data-clipboard-target="#blah">
  <img src="img/button.svg" alt="Copia negli appunti">
</button>

Il funzionamento dello script è quindi molto semplice, infatti l’identificatore #blah funge da riferimento per clipboard.js e una volta premuto il button associato al selettore btn l’URL contenuta nel campo di input diventerà disponibile anche negli appunti. Ma trigger e target non dovranno essere necessariamente due elementi distinti, motivo per il quale sarà possibile ricomprendere il primo all’interno del secondo, definendo di fatto soltanto il trigger:

<button class="btn" data-clipboard-text="Questo è il testo da copiare negli appunti">
  Copia negli appunti
</button>

Come è possibile notare, la sola presenza del trigger permetterà di non dover definire un identificatore che faccia da riferimento per il target, si noti però come il testo da copiare debba essere introdotto tramite l’attributo data-clipboard-text.

Via Clipboard.js

Pubblicitร 
Claudio Garau
Claudio Garau
Web developer, programmatore, Database Administrator, Linux Admin, docente e copywriter specializzato in contenuti sulle tecnologie orientate a Web, mobile, Cybersecurity e Digital Marketing per sviluppatori, PA e imprese.

Leggi anche...

Infinite scroll, come programmarlo su AMP e su Web con Javascript

L'infinite scroll è una tecnica di design e navigazione...

Codice Fiscale: 5 javascript per la verifica e il calcolo

Il codice fiscale รจ un identificativo tributario univoco che...

Math.ceil() – Arrotondare per eccesso con Javascript

Il metodo ceil() dell'oggetto Math di Javascript è utilizzato...

Minificare Javascript: librerie e strumenti online per comprimere il sorgente JS

La minificazione è un processo abbastanza diffuso nell'implementazione delle...

Javascript: svuotare un campo input o una textarea con un click

Quando si fornisce agli utenti un modulo per l'inserimento...

6 video player HTML5 per il tuo sito web

Con il rilascio delle specifiche definitive per HTML5 molte...
Pubblicitร