Come copio negli appunti in JavaScript?


3322

Qual è il modo migliore per copiare il testo negli appunti? (Multi-browser)

Ho provato:

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

ma in Internet Explorer genera un errore di sintassi. In Firefox, dice unsafeWindow is not defined.

Un bel trucco senza flash: in che modo Trello accede agli appunti dell'utente?


Solo curioso, cosa vuoi copiare negli appunti che l'utente non può fare da solo?
scunliffe,

233
Niente di speciale. Possono farlo da soli, ma voglio offrire anche la possibilità di fare clic su un pulsante senza preoccuparsi di selezionare la parte corretta del testo.
Santiago Corredoira,

4
Questo lungo post sul blog contiene molti modi per farlo: accedere agli Appunti di sistema con JavaScript - A Holy Grail?
Aaron Digulla,

Fornisce un'eccezione indefinita del browser in IE e in FF
Jagadeesh,

1
Se possiamo inserire del testo negli appunti dell'utente, possiamo rovinarlo.
Frank Fang,

Risposte:


2249

Panoramica

Esistono tre API principali del browser per la copia negli Appunti:

  1. API Appunti asincroni [navigator.clipboard.writeText]
    • Parte focalizzata sul testo disponibile in Chrome 66 (marzo 2018)
    • L'accesso è asincrono e utilizza promesse JavaScript , può essere scritto in modo che i prompt degli utenti di sicurezza (se visualizzati) non interrompano il JavaScript nella pagina.
    • Il testo può essere copiato negli appunti direttamente da una variabile.
    • Supportato solo su pagine pubblicate su HTTPS.
    • In Chrome 66 pagine nelle schede attive possono scrivere negli Appunti senza una richiesta di autorizzazioni.
  2. document.execCommand('copy')
    • La maggior parte dei browser lo supporta a partire da ~ aprile 2015 (vedi Supporto browser di seguito).
    • L'accesso è sincrono, ovvero interrompe JavaScript nella pagina fino al completamento, inclusa la visualizzazione e l'interazione dell'utente con qualsiasi richiesta di sicurezza.
    • Il testo viene letto dal DOM e posizionato negli Appunti.
    • Durante i test ~ aprile 2015, è stato notato che solo Internet Explorer visualizzava le richieste di autorizzazione durante la scrittura negli Appunti.
  3. Sostituzione dell'evento di copia
    • Vedere la documentazione dell'API degli Appunti su Sostituzione dell'evento di copia .
    • Consente di modificare ciò che appare negli Appunti da qualsiasi evento di copia, può includere altri formati di dati diversi dal testo normale.
    • Non coperto qui in quanto non risponde direttamente alla domanda.

Note generali di sviluppo

Non aspettarti che i comandi relativi agli Appunti funzionino mentre stai testando il codice nella console. Generalmente la pagina deve essere attiva (API Appunti Asincrona) o richiede l'interazione dell'utente (ad es. Un clic dell'utente) per consentire ( document.execCommand('copy')) di accedere agli Appunti, vedi sotto per maggiori dettagli.

IMPORTANTE (annotato qui 2020/02/20)

Si noti che poiché questo post è stato originariamente scritto deprecazione delle autorizzazioni negli IFRAME di origine incrociata e altri "sandboxing" IFRAME impediscono alle demo incorporate pulsanti "Esegui snippet di codice" e "esempio codepen.io" di funzionare in alcuni browser (inclusi Chrome e Microsoft Edge ).

Per sviluppare creare la propria pagina Web, servire quella pagina tramite la connessione HTTPS per testare e sviluppare.

Ecco una pagina di prova / demo che dimostra il funzionamento del codice: https://deanmarktaylor.github.io/clipboard-test/

Async + Fallback

A causa del livello di supporto del browser per la nuova API Appunti di Async, sarà probabilmente necessario ricorrere al document.execCommand('copy')metodo per ottenere una buona copertura del browser.

Ecco un semplice esempio (potrebbe non funzionare incorporato in questo sito, leggi la nota "importante" sopra):

function fallbackCopyTextToClipboard(text) {
  var textArea = document.createElement("textarea");
  textArea.value = text;
  
  // Avoid scrolling to bottom
  textArea.style.top = "0";
  textArea.style.left = "0";
  textArea.style.position = "fixed";

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Fallback: Copying text command was ' + msg);
  } catch (err) {
    console.error('Fallback: Oops, unable to copy', err);
  }

  document.body.removeChild(textArea);
}
function copyTextToClipboard(text) {
  if (!navigator.clipboard) {
    fallbackCopyTextToClipboard(text);
    return;
  }
  navigator.clipboard.writeText(text).then(function() {
    console.log('Async: Copying to clipboard was successful!');
  }, function(err) {
    console.error('Async: Could not copy text: ', err);
  });
}

var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');

copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});


copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});
<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:

  </textarea>
</div>

(l'esempio codepen.io potrebbe non funzionare, leggi la nota "importante" sopra). Nota che questo frammento non funziona bene nell'anteprima incorporata di Stack Overflow, puoi provarlo qui: https://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011

API Appunti asincroni

Si noti che esiste la possibilità di "richiedere l'autorizzazione" e testare l'accesso agli Appunti tramite l'API delle autorizzazioni in Chrome 66.

var text = "Example text to appear on clipboard";
navigator.clipboard.writeText(text).then(function() {
  console.log('Async: Copying to clipboard was successful!');
}, function(err) {
  console.error('Async: Could not copy text: ', err);
});

Document.ExecCommand ( 'copia')

Il resto di questo post esamina le sfumature e i dettagli document.execCommand('copy')dell'API.

Supporto per il browser

Il document.execCommand('copy')supporto JavaScript è cresciuto, vedere i collegamenti seguenti per gli aggiornamenti del browser:

Esempio semplice

(potrebbe non funzionare incorporato in questo sito, leggere la nota "importante" sopra)

var copyTextareaBtn = document.querySelector('.js-textareacopybtn');

copyTextareaBtn.addEventListener('click', function(event) {
  var copyTextarea = document.querySelector('.js-copytextarea');
  copyTextarea.focus();
  copyTextarea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }
});
<p>
  <button class="js-textareacopybtn" style="vertical-align:top;">Copy Textarea</button>
  <textarea class="js-copytextarea">Hello I'm some text</textarea>
</p>

Esempio complesso: copia negli appunti senza visualizzare input

Il semplice esempio sopra funziona alla grande se sullo schermo è visibile un elemento textareao input.

In alcuni casi potresti voler copiare il testo negli Appunti senza visualizzare un elemento input/ textarea. Questo è un esempio di un modo per aggirare questo (fondamentalmente inserire elemento, copiare negli appunti, rimuovere elemento):

Testato con Google Chrome 44, Firefox 42.0a1 e Internet Explorer 11.0.8600.17814.

(potrebbe non funzionare incorporato in questo sito, leggere la nota "importante" sopra)

function copyTextToClipboard(text) {
  var textArea = document.createElement("textarea");

  //
  // *** This styling is an extra step which is likely not required. ***
  //
  // Why is it here? To ensure:
  // 1. the element is able to have focus and selection.
  // 2. if element was to flash render it has minimal visual impact.
  // 3. less flakyness with selection and copying which **might** occur if
  //    the textarea element is not visible.
  //
  // The likelihood is the element won't even render, not even a
  // flash, so some of these are just precautions. However in
  // Internet Explorer the element is visible whilst the popup
  // box asking the user for permission for the web page to
  // copy to the clipboard.
  //

  // Place in top-left corner of screen regardless of scroll position.
  textArea.style.position = 'fixed';
  textArea.style.top = 0;
  textArea.style.left = 0;

  // Ensure it has a small width and height. Setting to 1px / 1em
  // doesn't work as this gives a negative w/h on some browsers.
  textArea.style.width = '2em';
  textArea.style.height = '2em';

  // We don't need padding, reducing the size if it does flash render.
  textArea.style.padding = 0;

  // Clean up any borders.
  textArea.style.border = 'none';
  textArea.style.outline = 'none';
  textArea.style.boxShadow = 'none';

  // Avoid flash of white box if rendered for any reason.
  textArea.style.background = 'transparent';


  textArea.value = text;

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }

  document.body.removeChild(textArea);
}


var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');

copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});


copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});
<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:

  </textarea>
</div>

Note aggiuntive

Funziona solo se l'utente esegue un'azione

Tutte le document.execCommand('copy')chiamate devono aver luogo come risultato diretto di un'azione dell'utente, ad es. Gestore di eventi click. Questa è una misura per evitare di scherzare con gli appunti dell'utente quando non se lo aspettano.

Vedi il post di Google Developers qui per maggiori informazioni.

API degli Appunti

Nota la specifica completa della bozza dell'API per Appunti è disponibile qui: https://w3c.github.io/clipboard-apis/

È supportato?

  • document.queryCommandSupported('copy')dovrebbe tornare truese il comando "è supportato dal browser".
  • e document.queryCommandEnabled('copy')restituire truese l'operazione document.execCommand('copy')avrà esito positivo se viene chiamata ora. Verifica per assicurarsi che il comando sia stato chiamato da un thread avviato dall'utente e che siano soddisfatti altri requisiti.

Tuttavia, come esempio di problemi di compatibilità del browser, Google Chrome da ~ aprile a ~ ottobre 2015 è tornato trueda solo document.queryCommandSupported('copy')se il comando è stato chiamato da un thread avviato dall'utente.

Nota i dettagli di compatibilità di seguito.

Dettagli sulla compatibilità del browser

Mentre una semplice chiamata da document.execCommand('copy')racchiudere in un blocco try/ catchchiamato come risultato di un clic dell'utente ti consentirà di utilizzare la massima compatibilità, alcune delle seguenti condizioni:

Qualsiasi chiamata a document.execCommand, document.queryCommandSupportedo document.queryCommandEnableddovrebbe essere racchiusa in un blocco try/ catch.

Diverse implementazioni del browser e versioni del browser generano tipi diversi di eccezioni quando vengono chiamate anziché restituite false.

Diverse implementazioni del browser sono ancora in evoluzione e l' API degli Appunti è ancora in bozza, quindi ricorda di fare i tuoi test.


41
come copiare direttamente da un .ie dati variabili: var str = "word";?
jscripter,

10
@BubuDaba Crea un manichino nascosto <textarea>con JS, aggiungilo a document.body, imposta il suo valore sulla variabile e usalo al passo copyTextarea, quindi rimuovilo subito dopo aver copiato il contenuto.
SeinopSys,

3
C'è qualcosa per Safari o qualche indicatore che verrà implementato in Safari?
www139,

3
L'unica versione che ho trovato funziona su tutti i browser. Ho scoperto che quando lo utilizzavo in Boostrap Modal ho dovuto aggiungere l'area di testo al modale. Darei +1000 se potessi per la tua soluzione !!! GRAZIE!
Patrick,

3
@AyaSalama il punto chiave è che l'azione "copia" non può aver luogo se non appare al browser l'utente sta eseguendo l'azione. L'utente non sarebbe in grado di eseguire l'azione se l'elemento è disegnato con "display: none" in quanto non sarebbe in grado di vederlo, né di interagire con esso.
Decano Taylor,

1257

La copia automatica negli appunti può essere pericolosa, quindi la maggior parte dei browser (tranne IE) lo rende molto difficile. Personalmente, utilizzo il seguente semplice trucco:

function copyToClipboard(text) {
  window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
}

All'utente viene visualizzata la finestra del prompt, in cui il testo da copiare è già selezionato. Ora basta premere Ctrl+ Ce Enter(per chiudere la casella) - e voilà!

Ora l'operazione di copia degli Appunti è SICURA, perché l'utente lo fa manualmente (ma in modo abbastanza semplice). Ovviamente, funziona su tutti i browser.

<button id="demo" onclick="copyToClipboard(document.getElementById('demo').innerHTML)">This is what I want to copy</button>

<script>
  function copyToClipboard(text) {
    window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
  }
</script>


91
Intelligente, ma supporta solo una riga singola.
Aram Kocharyan,

61
È banale cambiare la funzione "prompt" in un modale personalizzato, il trucco è usare un campo di contenuto modificabile e preselezionare il testo, e che non rompa l'interfaccia utente del browser imponendo che l'utente prenda il l'azione stessa. A ++
Jon z,

110
continua a non usare JavaScript per copiare negli appunti ^ _ ^
RozzA

23
Se il tuo testo ha più di 2000 caratteri verrà troncato, ma per campioni di testo più piccoli funziona alla grande
RasTheDestroyer

445
Strano che questo ottenga 457 voti mentre non risponde alla domanda: copia negli appunti in Javascript !
Stevenvh,

300

Il seguente approccio funziona in Chrome, Firefox, Internet Explorer ed Edge e nelle versioni recenti di Safari (il supporto per la copia è stato aggiunto nella versione 10 rilasciata nell'ottobre 2016).

  • Crea un'area di testo e imposta il contenuto sul testo che desideri copiare negli Appunti.
  • Aggiungi la textarea al DOM.
  • Seleziona il testo nell'area di testo.
  • Chiama document.execCommand ("copia")
  • Rimuovi la textarea dalla dom.

Nota: non vedrai l'area di testo, poiché viene aggiunta e rimossa all'interno della stessa invocazione sincrona del codice Javascript.

Alcuni aspetti a cui prestare attenzione se lo stai implementando da solo:

  • Per motivi di sicurezza, questo può essere chiamato solo da un gestore eventi come clic (proprio come con l'apertura di Windows).
  • Internet Explorer mostrerà una finestra di dialogo delle autorizzazioni al primo aggiornamento degli Appunti.
  • Internet Explorer e Edge scorreranno quando l'area di testo è focalizzata.
  • execCommand () potrebbe lanciare in alcuni casi.
  • Newline e tabulazioni possono essere ingoiate a meno che tu non usi una textarea. (La maggior parte degli articoli sembra raccomandare l'uso di un div)
  • L'area di testo sarà visibile mentre viene visualizzata la finestra di dialogo di Internet Explorer, è necessario nasconderla oppure utilizzare l'API Databoard Appunti specifica di Internet Explorer.
  • In Internet Explorer gli amministratori di sistema possono disabilitare l'API degli Appunti.

La funzione seguente dovrebbe gestire tutti i seguenti problemi nel modo più pulito possibile. Si prega di lasciare un commento in caso di problemi o suggerimenti per migliorarlo.

// Copies a string to the clipboard. Must be called from within an
// event handler such as click. May return false if it failed, but
// this is not always possible. Browser support for Chrome 43+,
// Firefox 42+, Safari 10+, Edge and Internet Explorer 10+.
// Internet Explorer: The clipboard feature may be disabled by
// an administrator. By default a prompt is shown the first
// time the clipboard is used (per session).
function copyToClipboard(text) {
    if (window.clipboardData && window.clipboardData.setData) {
        // Internet Explorer-specific code path to prevent textarea being shown while dialog is visible.
        return clipboardData.setData("Text", text);

    }
    else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
        var textarea = document.createElement("textarea");
        textarea.textContent = text;
        textarea.style.position = "fixed";  // Prevent scrolling to bottom of page in Microsoft Edge.
        document.body.appendChild(textarea);
        textarea.select();
        try {
            return document.execCommand("copy");  // Security exception may be thrown by some browsers.
        }
        catch (ex) {
            console.warn("Copy to clipboard failed.", ex);
            return false;
        }
        finally {
            document.body.removeChild(textarea);
        }
    }
}

https://jsfiddle.net/fx6a6n6x/


9
Bella risposta: supporto cross-browser, gestione degli errori + pulizia. A partire dal nuovo supporto odierno per queryCommandSupported, la copia negli Appunti è ora fattibile in Javascript e questa dovrebbe essere la risposta accettata, invece di 'window.prompt' scomodo ("Copia negli appunti: Ctrl + C, Invio", testo) 'soluzione alternativa. window.clipboardData è supportato in IE9, quindi dovresti aggiungere IE9 nell'elenco di supporto del browser e penso che forse anche IE8 e precedenti, ma è necessario verificarlo.
user627283

Si. IE 8/9 Dovrebbe essere ok. La nostra app non li supporta. Quindi non ho testato. IE interrompe il supporto a gennaio, quindi non sono troppo agitato. Speriamo che il supporto di Safari arrivi presto. Sono sicuro che sia sul loro radar.
Greg Lowe,

4
@SantiagoCorredoira: nel 2016, questa merita di essere la risposta accettata. Considera di riassegnare la BGT (grande segno di spunta verde).
Lawrence Dol,

3
@Noitidart I Tested e funziona perfettamente con Firefox 54, Chrome 60 e il browser Edge, anche quando lo stato attivo non è nel documento HTML, l'errore che stai riscontrando è probabilmente specifico per la versione FF 55
Tosin John

2
@Noitidart Funziona ancora perfettamente qui, concentrandosi sugli strumenti di sviluppo non lo ha fermato. A proposito, cosa farà un normale utente di app Web sugli strumenti per sviluppatori
Tosin John,

97

Ecco la mia opinione su quello ...

function copy(text) {
    var input = document.createElement('input');
    input.setAttribute('value', text);
    document.body.appendChild(input);
    input.select();
    var result = document.execCommand('copy');
    document.body.removeChild(input);
    return result;
 }

@korayem: Nota che l'utilizzo del inputcampo html non rispetta le interruzioni di riga \ne appiattisce qualsiasi testo in un'unica riga.

Come menzionato da @nikksan nei commenti, l'utilizzo textarearisolverà il problema nel modo seguente:

function copy(text) {
    var input = document.createElement('textarea');
    input.innerHTML = text;
    document.body.appendChild(input);
    input.select();
    var result = document.execCommand('copy');
    document.body.removeChild(input);
    return result;
}

@nikksan come copiare la stringa con \n?
sof-03,

2
@ sof-03 usa textarea invece di input e aggiungi \r\nper un'interruzione di riga
nikksan

1
Non funziona in Microsoft Edge 42.17134.1.0 su Win10x64
Honsa Stunna,

3
Ho copiato la tua risposta. Funziona con Chrome ed è tutto ciò di cui ho bisogno.
user875234,

Questa è la soluzione più semplice che funziona con Firefox v68.0.2 (64-bit).
Arya,

88

Se vuoi una soluzione davvero semplice (richiede meno di 5 minuti per l'integrazione) e sembra subito pronta , allora Clippy è una buona alternativa ad alcune delle soluzioni più complesse.

È stato scritto da un co-fondatore di GitHub. Esempio di codice di incorporamento Flash di seguito:

<object
   classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
   width="110"
   height="14"
   id="clippy">
  <param name="movie" value="/flash/clippy.swf"/>
  <param name="allowScriptAccess" value="always"/>
  <param name="quality" value="high"/>
  <param name="scale" value="noscale"/>
  <param NAME="FlashVars" value="text=#{text}"/>
  <param name="bgcolor" value="#{bgcolor}"/>
  <embed
     src="/flash/clippy.swf"
     width="110"
     height="14"
     name="clippy"
     quality="high"
     allowScriptAccess="always"
     type="application/x-shockwave-flash"
     pluginspage="http://www.macromedia.com/go/getflashplayer"
     FlashVars="text=#{text}"
     bgcolor="#{bgcolor}"/>
</object>

Ricorda di sostituire #{text}con il testo che devi copiare e #{bgcolor}con un colore.


12
Per chiunque sia interessato, controlla che Clippy sia utilizzato su GitHub durante la copia dell'URL per il repository.
Radek,

66
Cordiali saluti, l'uso di Clippy su GitHub è stato sostituito da ZeroClipboard.
James M. Greene,

219
L'OP voleva una soluzione in JavaScript. Non lampeggiante.
MT.

21
@MT, con "javascript" alcune persone intendono "nel browser client", quindi mentre solo JS potrebbe essere un requisito, molte delle persone che sperano in questa risposta sono davvero alla ricerca di JS-o-altro-ampiamente supportato- client-tech. Flash non colpisce tutte le piattaforme, ma per una funzionalità polacca come il supporto degli Appunti, vale la pena aggiungere se migliora la UX su una finestra di dialogo popup (cosa che sicuramente fa).
Dave Dopson,

13
Ormai fare affidamento su Flash significa avere cose che non funzionano per una percentuale di visitatori del sito, il che è inaccettabile per quasi tutti coloro che fanno sviluppo web.
jinglesthula,

86

La lettura e la modifica degli Appunti da una pagina Web solleva problemi di sicurezza e privacy. Tuttavia, in Internet Explorer, è possibile farlo. Ho trovato questo frammento di esempio :

    <script type="text/javascript">
        function select_all(obj) {
            var text_val=eval(obj);
            text_val.focus();
            text_val.select();
            r = text_val.createTextRange();
            if (!r.execCommand) return; // feature detection
            r.execCommand('copy');
        }
    </script>
    <input value="http://www.sajithmr.com"
     onclick="select_all(this)" name="url" type="text" />


7
L'uso del flash per una semplice operazione di copia sembra eccessivo, felice che ci fosse un modo JS pulito per farlo. E dal momento che siamo in un ambiente aziendale. IE va bene. Grazie Bandi!
Eddie,

5
per favore spiega cosa execCommand(\\’copy\\’);significa, se non copiare negli appunti per IE? @mrBorna
RozzA

20
Non usare if(!document.all)ma per if(!r.execCommand)timore che altri lo implementino! Document.all è assolutamente irrilevante per questo.
m93a,

1
Amico, questo è ciò che amo del codice semplice e pulito, funziona quasi per sempre con una piccola manutenzione. Questo l'ha fatto per me, funziona magnificamente.
Samuel Ramzan,

1
non funziona negli ultimi Chrome, Firefox o MS Edge :(
Jonathan Marzullo

69

Di recente ho scritto un post sul blog tecnico su questo problema (lavoro in Lucidchart e recentemente abbiamo fatto una revisione nei nostri appunti).

La copia del testo negli appunti è relativamente semplice, presupponendo che si desideri farlo durante un evento di copia del sistema (l'utente preme CtrlCo utilizza il menu del browser).

var isIe = (navigator.userAgent.toLowerCase().indexOf("msie") != -1 
           || navigator.userAgent.toLowerCase().indexOf("trident") != -1);

document.addEventListener('copy', function(e) {
    var textToPutOnClipboard = "This is some text";
    if (isIe) {
        window.clipboardData.setData('Text', textToPutOnClipboard);    
    } else {
        e.clipboardData.setData('text/plain', textToPutOnClipboard);
    }
    e.preventDefault();
});

Inserire il testo negli Appunti non durante un evento di copia del sistema è molto più difficile. Sembra che alcune di queste altre risposte facciano riferimento a come farlo tramite Flash, che è l'unico modo cross-browser per farlo (per quanto ho capito).

Oltre a ciò, ci sono alcune opzioni su base browser per browser.

Questo è il più semplice in IE, dove puoi accedere all'oggetto ClipboardData in qualsiasi momento da JavaScript tramite:

window.clipboardData

(Quando si tenta di eseguire questa operazione al di fuori di un evento di taglio, copia o incolla del sistema, IE richiederà all'utente di concedere l'autorizzazione per gli appunti dell'applicazione Web.)

In Chrome, puoi creare un'estensione di Chrome che ti darà le autorizzazioni degli appunti (questo è ciò che facciamo per Lucidchart). Quindi, per gli utenti con l'estensione installata, dovrai semplicemente attivare l'evento di sistema da solo:

document.execCommand('copy');

Sembra che Firefox abbia alcune opzioni che consentono agli utenti di concedere autorizzazioni a determinati siti per accedere agli Appunti, ma non ho provato nessuno di questi personalmente.


2
Non menzionato nel post del blog (spero di aggiornarlo nel prossimo futuro), è la possibilità di innescare taglia e copia usando execCommand. Questo è supportato in IE10 +, Chrome 43+ e Opera29 +. Leggi qui. updates.html5rocks.com/2015/04/cut-and-copy-commands
Richard Shurtz,

Un problema è che dirotta altri normali eventi di copia.
Brock Adams,

NB! Questo browser sniffing è CATTIVO. Esegui lo sniffing delle funzionalità. Stai rendendo difficile l'aggiornamento di IE.
odinho - Velmont,

51

clipboard.js è una piccola utility non Flash che consente di copiare negli Appunti testo o dati HTML. È molto facile da usare, basta includere .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 .

Nota: ora è stato deprecato. Migrare qui .


Questa libreria viene utilizzata da angular.io per Tour of Hero e fallback in modalità aggraziata per browser che non supportano execCommand visualizzando un testo preselezionato che l'utente deve solo copiare.
John-Philip,

1
Sembra che clipboard.js sia stato sostituito o biforcato, ma sembra sopravvivere
Joao

35

ZeroClipboard è la migliore soluzione cross-browser che ho trovato:

<div id="copy" data-clipboard-text="Copy Me!">Click to copy</div>    
<script src="ZeroClipboard.js"></script>
<script>
  var clip = new ZeroClipboard( document.getElementById('copy') );
</script>

Se hai bisogno del supporto non flash per iOS, devi solo aggiungere un fallback:

clip.on( 'noflash', function ( client, args ) {
    $("#copy").click(function(){            
        var txt = $(this).attr('data-clipboard-text');
        prompt ("Copy link, then click OK.", txt);
    });
});  

http://zeroclipboard.org/

https://github.com/zeroclipboard/ZeroClipboard


25
cross-browser con Flash? non funziona in iOS e Android 4.4
Raptor

1
Vedi la risposta aggiornata. Ciò consente meno passaggi per gli utenti di flash e un fallback per tutti gli altri.
Justin,

8
ha un miliardo di righe di codice. è assolutamente ridicolo. meglio non farlo affatto che includere un simile mostro in un progetto
vsync,

2
C'è una versione semplice gist.github.com/JamesMGreene/8698897 che è 20K che non ha tutte le campane e fischi nella versione 74k. Nessuno dei due è molto grande. Suppongo che la maggior parte degli utenti vada bene con i millisecondi in più che impiegherà un file 74k o 20k scaricato, quindi copia / incolla è un clic invece di due.
Giustino,

@Justin Non riesco proprio a farlo funzionare localmente, anche se copio e incollo gli esempi (apporto modifiche minime, ad esempio il valore di srcnei tag di script). Sento che la loro documentazione è carina ma inefficiente.
Gui Imamura,

29

Nel 2018, ecco come puoi procedere:

async copySomething(text?) {
  try {
    const toCopy = text || location.href;
    await navigator.clipboard.writeText(toCopy);
    console.log('Text or Page URL copied');
  }
  catch (err) {
    console.error('Failed to copy: ', err);
  }
}

È usato nel mio codice Angular 6+ in questo modo:

<button mat-menu-item (click)="copySomething()">
    <span>Copy link</span>
</button>

Se passo una stringa, la copia. In caso contrario, copia l'URL della pagina.

Si può fare anche più ginnastica per gli appunti. Vedi maggiori informazioni qui:

Sblocco dell'accesso agli Appunti


sei collegato a localhost
Joe Warner il

2
Tieni presente che questo non funziona in Safari (versione 11.1.2)
arjun27

1
@ arjun27 Beh, speriamo che un giorno Apple raggiunga. Sebbene questo caniuse.com/#feat=clipboard mostri che la versione sopra menzionata è parzialmente supportata.
KhoPhi,

2
Ricevo entrambe le funzioni readText, writeText a Promise in stato rifiutato
ramin

3
Secondo il link fornito, "navigator.clipboard è supportato solo per le pagine pubblicate su HTTPS"
TimH - Codidact

26

Da uno dei progetti a cui ho lavorato, un plug-in di copia negli appunti di jQuery che utilizza gli Appunti Zero libreria .

È più facile da usare rispetto al plug-in Zero Clipboard nativo se sei un utente jQuery pesante.


6
92kb non è poi così grande, funziona velocemente e puoi usarlo text()invece che innerHTML()se ti piace ..
RozzA

17
@John: innerHTMLè stato supportato cross-browser per molto tempo ormai. Solo perché Microsoft inizialmente ha avuto l'idea che non lo rende inaffidabile o proprietario. Inoltre è ora finalmente aggiunto alle specifiche ufficiali (dopo che tutti i principali produttori di browser hanno già aggiunto il supporto per ... sospiro ).
James M. Greene,

19
@John Ti lamenti del fatto che jQuery non sia abbastanza JavaScripty in una risposta che utilizza Flash;)
Max Nanasy

4
innerHTML è meglio delle alternative nella maggior parte dei casi. Scendi dal tuo cavallo alto! È più veloce, più efficiente e non richiede un nuovo rendering della pagina.
orbita attorno a Eden il

4
@RozzA 92KBè davvero grande. Fino a quando LTE matura GPRS è lo standard di dati mobili WW e inizia alle 1 KB/s. Fai la matematica da solo.
Tino,

23

Poiché Chrome 42+ e Firefox 41+ supportano ora il comando document.execCommand ('copy') . Così ho creato un paio di funzioni per un cross-browser copy-to-clipboard capacità utilizzando una combinazione di risposta vecchia di Tim di Down e la risposta di Google per sviluppatori :

function selectElementContents(el) {
    // Copy textarea, pre, div, etc.
    if (document.body.createTextRange) {
        // IE
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.select();
        textRange.execCommand("Copy");
    } 
    else if (window.getSelection && document.createRange) {
        // Non-Internet Explorer
        var range = document.createRange();
        range.selectNodeContents(el);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
        try {
            var successful = document.execCommand('copy');
            var msg = successful ? 'successful' : 'unsuccessful';
            console.log('Copy command was ' + msg);
        }
        catch (err) {
            console.log('Oops, unable to copy');
        }
    }
} // end function selectElementContents(el)

function make_copy_button(el) {
    var copy_btn = document.createElement('input');
    copy_btn.type = "button";
    el.parentNode.insertBefore(copy_btn, el.nextSibling);
    copy_btn.onclick = function() {
        selectElementContents(el);
    };

    if (document.queryCommandSupported("copy") || parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2]) >= 42) {
        // Copy works with Internet Explorer 4+, Chrome 42+, Firefox 41+, Opera 29+
        copy_btn.value = "Copy to Clipboard";
    }
    else {
        // Select only for Safari and older Chrome, Firefox and Opera
        copy_btn.value = "Select All (then press Ctrl + C to Copy)";
    }
}
/* Note: document.queryCommandSupported("copy") should return "true" on browsers that support copy
    but there was a bug in Chrome versions 42 to 47 that makes it return "false".  So in those
    versions of Chrome feature detection does not work!
    See https://code.google.com/p/chromium/issues/detail?id=476508
*/

make_copy_button(document.getElementById("markup"));
<pre id="markup">
  Text that can be copied or selected with cross browser support.
</pre>


Grazie per aver riassunto questo! Hai un piccolo errore nel tuo codice: hai definito la variabile "range" due volte (var range = document.createRange ()).
Christian Engel,

1
Hai ragione @ChristianEngel. Ho rimosso il secondo. Non so come sia arrivato lì.
Jeff Baker,

23

Lo uso molto bene ( senza jQuery o altri framework).

function copyToClp(txt){
    txt = document.createTextNode(txt);
    var m = document;
    var w = window;
    var b = m.body;
    b.appendChild(txt);
    if (b.createTextRange) {
        var d = b.createTextRange();
        d.moveToElementText(txt);
        d.select();
        m.execCommand('copy');
    } 
    else {
        var d = m.createRange();
        var g = w.getSelection;
        d.selectNodeContents(txt);
        g().removeAllRanges();
        g().addRange(d);
        m.execCommand('copy');
        g().removeAllRanges();
    }
    txt.remove();
}

avvertimento

Le schede vengono convertite in spazi (almeno in Chrome).


In questo approccio mancano gli spazi
Bikram,

1
Cromo. le schede vengono convertite in uno spazio
Bikram,

22

Ho trovato la seguente soluzione:

Il gestore dei tasti giù crea il tag "pre". Impostiamo il contenuto da copiare su questo tag, quindi effettuiamo una selezione su questo tag e restituiamo true nel gestore. Questo chiama il gestore standard di Chrome e copia il testo selezionato.

Se necessario, è possibile impostare il timeout per la funzione per il ripristino della selezione precedente. La mia implementazione su Mootools:

   function EnybyClipboard() {
     this.saveSelection = false;
     this.callback = false;
     this.pastedText = false;

     this.restoreSelection = function() {
       if (this.saveSelection) {
         window.getSelection().removeAllRanges();
         for (var i = 0; i < this.saveSelection.length; i++) {
           window.getSelection().addRange(this.saveSelection[i]);
         }
         this.saveSelection = false;
       }
     };

     this.copyText = function(text) {
       var div = $('special_copy');
       if (!div) {
         div = new Element('pre', {
           'id': 'special_copy',
           'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;'
         });
         div.injectInside(document.body);
       }
       div.set('text', text);
       if (document.createRange) {
         var rng = document.createRange();
         rng.selectNodeContents(div);
         this.saveSelection = [];
         var selection = window.getSelection();
         for (var i = 0; i < selection.rangeCount; i++) {
           this.saveSelection[i] = selection.getRangeAt(i);
         }
         window.getSelection().removeAllRanges();
         window.getSelection().addRange(rng);
         setTimeout(this.restoreSelection.bind(this), 100);
       } else return alert('Copy not work. :(');
     };

     this.getPastedText = function() {
       if (!this.pastedText) alert('Nothing to paste. :(');
       return this.pastedText;
     };

     this.pasteText = function(callback) {
       var div = $('special_paste');
       if (!div) {
         div = new Element('textarea', {
           'id': 'special_paste',
           'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;'
         });
         div.injectInside(document.body);
         div.addEvent('keyup', function() {
           if (this.callback) {
             this.pastedText = $('special_paste').get('value');
             this.callback.call(null, this.pastedText);
             this.callback = false;
             this.pastedText = false;
             setTimeout(this.restoreSelection.bind(this), 100);
           }
         }.bind(this));
       }
       div.set('value', '');
       if (document.createRange) {
         var rng = document.createRange();
         rng.selectNodeContents(div);
         this.saveSelection = [];
         var selection = window.getSelection();
         for (var i = 0; i < selection.rangeCount; i++) {
           this.saveSelection[i] = selection.getRangeAt(i);
         }
         window.getSelection().removeAllRanges();
         window.getSelection().addRange(rng);
         div.focus();
         this.callback = callback;
       } else return alert('Fail to paste. :(');
     };
   }

Uso:

enyby_clip = new EnybyClipboard(); //init 

enyby_clip.copyText('some_text'); // place this in CTRL+C handler and return true;

enyby_clip.pasteText(function callback(pasted_text) {
        alert(pasted_text);
}); // place this in CTRL+V handler and return true;

Incolla crea textarea e funziona allo stesso modo.

PS può essere questa soluzione può essere utilizzata per creare una soluzione completamente cross-browser senza flash. Funziona in FF e Chrome.


2
Qualcuno l'ha provato? Sembra una cosa carina, nel caso in cui funzioni davvero su una vasta gamma di browser!
Michael,

1
Demo jsfiddle.net/H2FHC : fiddle.jshell.net/H2FHC/show Per favore aprilo e premi Ctrl + V o Ctrl + C. Forcelle FF 19.0 perfettamente. Anche in Chrome 25.0.1364.97 m. Opera 12.14 - OK. Safari 5.1.7 per Windows - OK. IE - FAIL.
Enyby,

Per IE è necessario eseguire focus sull'elemento all'interno della pagina. Vedi fiddle.jshell.net/H2FHC/3/show e fiddle.jshell.net/H2FHC/3 Ha lavorato in IE 9/10. IE 6/7 richiede che il processo crei la selezione in altro modo perché document.createRange non è supportato.
Enyby,

21

Gli altri metodi copieranno il testo negli appunti. Per copiare HTML (ad esempio, è possibile incollare i risultati in un editor WSIWYG), è possibile eseguire SOLO IE in IE . Questo è sostanzialmente diverso dagli altri metodi, in quanto il browser seleziona effettivamente il contenuto in modo visibile.

// create an editable DIV and append the HTML content you want copied
var editableDiv = document.createElement("div");
with (editableDiv) {
    contentEditable = true;
}     
editableDiv.appendChild(someContentElement);          

// select the editable content and copy it to the clipboard
var r = document.body.createTextRange();
r.moveToElementText(editableDiv);
r.select();  
r.execCommand("Copy");

// deselect, so the browser doesn't leave the element visibly selected
r.moveToElementText(someHiddenDiv);
r.select();   

vedere la soluzione più completa HTML qui stackoverflow.com/questions/34191780/...~~V~~singular~~3rd
kofifus

21

Ho messo insieme quello che penso sia il migliore.

  • Utilizza cssText per evitare eccezioni in Internet Explorer rispetto allo stile direttamente.
  • Ripristina la selezione se ce n'era una
  • Imposta in sola lettura in modo che la tastiera non venga visualizzata sui dispositivi mobili
  • Ha una soluzione alternativa per iOS in modo che funzioni effettivamente poiché normalmente blocca execCommand.

Ecco qui:

const copyToClipboard = (function initClipboardText() {
  const textarea = document.createElement('textarea');

  // Move it off screen.
  textarea.style.cssText = 'position: absolute; left: -99999em';

  // Set to readonly to prevent mobile devices opening a keyboard when
  // text is .select()'ed.
  textarea.setAttribute('readonly', true);

  document.body.appendChild(textarea);

  return function setClipboardText(text) {
    textarea.value = text;

    // Check if there is any content selected previously.
    const selected = document.getSelection().rangeCount > 0 ?
      document.getSelection().getRangeAt(0) : false;

    // iOS Safari blocks programmtic execCommand copying normally, without this hack.
    // /programming/34045777/copy-to-clipboard-using-javascript-in-ios
    if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
      const editable = textarea.contentEditable;
      textarea.contentEditable = true;
      const range = document.createRange();
      range.selectNodeContents(textarea);
      const sel = window.getSelection();
      sel.removeAllRanges();
      sel.addRange(range);
      textarea.setSelectionRange(0, 999999);
      textarea.contentEditable = editable;
    }
    else {
      textarea.select();
    }

    try {
      const result = document.execCommand('copy');

      // Restore previous selection.
      if (selected) {
        document.getSelection().removeAllRanges();
        document.getSelection().addRange(selected);
      }

      return result;
    }
    catch (err) {
      console.error(err);
      return false;
    }
  };
})();

Uso: copyToClipboard('some text')


13

A partire da Flash 10, è possibile copiare negli Appunti solo se l'azione ha origine dall'interazione dell'utente con un oggetto Flash. ( Leggi la sezione relativa dall'annuncio di Adobe Flash 10 )

La soluzione è di esagerare con un oggetto flash sopra il pulsante Copia, o qualunque elemento inizi la copia. Zero Clipboard è attualmente la migliore libreria con questa implementazione. Gli sviluppatori esperti di Flash potrebbero voler creare la propria libreria.


12

  <!DOCTYPE html>

  <style>
    #t {
      width: 1px
      height: 1px
      border: none
    }
    #t:focus {
      outline: none
    }
  </style>

  <script>
    function copy(text) {
      var t = document.getElementById('t')
      t.innerHTML = text
      t.select()
      try {
        var successful = document.execCommand('copy')
        var msg = successful ? 'successfully' : 'unsuccessfully'
        console.log('text coppied ' + msg)
      } catch (err) {
        console.log('Unable to copy text')
      }
      t.innerHTML = ''
    }
  </script>

  <textarea id=t></textarea>

  <button onclick="copy('hello world')">
    Click me
  </button>


La migliore risposta: D, puoi migliorarla con qualcosa del genere: #t {position: absolute; sinistra: 0; indice z: -900; larghezza: 0px; altezza: 0px; bordo: nessuno; } Quindi sarà completamente nascosto! Ma grazie davvero fratello!
Federico Navarrete,

#t {resize: none;}
SmartManoj

Una spiegazione sarebbe in ordine.
Peter Mortensen,

12

Ho trovato la seguente soluzione:

Ho il testo in un input nascosto. Poiché setSelectionRangenon funziona su input nascosti, ho modificato temporaneamente il tipo in testo, copiato il testo e quindi reso nuovamente nascosto. Se si desidera copiare il testo da un elemento, è possibile passarlo alla funzione e salvarne il contenuto nella variabile di destinazione.

jQuery('#copy').on('click', function () {
    copyToClipboard();
});

function copyToClipboard() {
    var target = jQuery('#hidden_text');

    // Make it visible, so can be focused
    target.attr('type', 'text');
    target.focus();
    // Select all the text
    target[0].setSelectionRange(0, target.val().length);

    // Copy the selection
    var succeed;
    try {
        succeed = document.execCommand("copy");
    }
    catch (e) {
        succeed = false;
    }

    // Hide input again
    target.attr('type', 'hidden');

    return succeed;
}

11

Copia il testo dall'input HTML negli appunti:

 function myFunction() {
   /* Get the text field */
   var copyText = document.getElementById("myInput");

   /* Select the text field */
   copyText.select();

   /* Copy the text inside the text field */
   document.execCommand("Copy");

   /* Alert the copied text */
   alert("Copied the text: " + copyText.value);
 }
 <!-- The text field -->
 <input type="text" value="Hello Friend" id="myInput">

 <!-- The button used to copy the text -->
<button onclick="myFunction()">Copy text</button>

Nota: il document.execCommand()metodo non è supportato in Internet Explorer 9 e versioni precedenti.

Fonte : W3Schools - Copia il testo negli Appunti


11

Ci sono già molte risposte, tuttavia piace aggiungerne una (jQuery). Funziona alla grande su qualsiasi browser, anche su dispositivi mobili (ad esempio, richiede sicurezza, ma quando lo accetti funziona bene).

function appCopyToClipBoard(sText)
{
    var oText = false,
        bResult = false;
    try
    {
        oText = document.createElement("textarea");
        $(oText).addClass('clipboardCopier').val(sText).insertAfter('body').focus();
        oText.select();
        document.execCommand("Copy");
        bResult = true;
    }
    catch(e) {
    }

    $(oText).remove();
    return bResult;
}

Nel tuo codice:

if (!appCopyToClipBoard('Hai there! This is copied to the clipboard.'))
{
    alert('Sorry, copy to clipboard failed.');
}

9

Questa è una sorta di combinazione tra le altre risposte.

var copyToClipboard = function(textToCopy){
    $("body")
        .append($('<textarea name="fname" class="textToCopyInput"/>' )
        .val(textToCopy))
        .find(".textToCopyInput")
        .select();
      try {
        var successful = document.execCommand('copy');
        var msg = successful ? 'successful' : 'unsuccessful';
        alert('Text copied to clipboard!');
      } catch (err) {
          window.prompt("To copy the text to clipboard: Ctrl+C, Enter", textToCopy);
      }
     $(".textToCopyInput").remove();
}

Usa jQuery, ma ovviamente non è necessario. Puoi cambiarlo se vuoi. Ho appena avuto jQuery a mia disposizione. Puoi anche aggiungere alcuni CSS per assicurarti che l'input non sia visibile. Ad esempio qualcosa del tipo:

.textToCopyInput{opacity: 0; position: absolute;}

O ovviamente potresti anche fare uno stile in linea

.append($('<textarea name="fname" style="opacity: 0;  position: absolute;" class="textToCopyInput"/>' )

Come copiare direttamente da un dato variabile .ie: var str = "word"; ?

Il msg variabile non è utilizzato
Voyager

Meglio usare '<textarea class = "textToCopyInput" /> </textarea>' nel caso textToCopycontenga\n
Voyager


8

Ho avuto lo stesso problema nel creare una modifica della griglia personalizzata da (qualcosa come Excel) e la compatibilità con Excel. Ho dovuto supportare la selezione di più celle, copia e incolla.

Soluzione: creare un'area di testo in cui verranno inseriti i dati per la copia da parte dell'utente (per me quando l'utente seleziona le celle), impostare lo stato attivo su di esso (ad esempio, quando l'utente preme Ctrl ) e selezionare l'intero testo.

Quindi, quando l'utente preme Ctrl+ Cottiene le celle copiate che ha selezionato. Dopo aver testato il ridimensionamento dell'area di testo su un pixel (non ho verificato se funzionerà sul display: nessuno). Funziona bene su tutti i browser ed è trasparente per l'utente.

Incollare - potresti fare lo stesso in questo modo (differisce dal tuo target) - mantieni la concentrazione su textarea e cattura gli eventi incolla usando onpaste (nel mio progetto uso textareas nelle celle per modificare).

Non posso incollare un esempio (progetto commerciale), ma hai capito.


7

Ho usato clipboard.js.

Possiamo ottenerlo su npm:

npm install clipboard --save

E anche su Bower

bower install clipboard --save

Utilizzo ed esempi sono disponibili su https://zenorocha.github.io/clipboard.js/ .


Avevo paura che non fosse compatibile con i contenuti dinamici, ma lo è ;-) Penso che sia la soluzione migliore, ADESSO, rispetto alla vecchia del 2008.
BENARD Patrick


6

Questa è un'espansione della risposta di @ Chase, con il vantaggio che funzionerà con gli elementi IMMAGINE e TABELLA, non solo con DIV su IE9.

if (document.createRange) {
    // IE9 and modern browsers
    var r = document.createRange();
    r.setStartBefore(to_copy);
    r.setEndAfter(to_copy);
    r.selectNode(to_copy);
    var sel = window.getSelection();
    sel.addRange(r);
    document.execCommand('Copy');  // does nothing on FF
} else {
    // IE 8 and earlier.  This stuff won't work on IE9.
    // (unless forced into a backward compatibility mode,
    // or selecting plain divs, not img or table). 
    var r = document.body.createTextRange();
    r.moveToElementText(to_copy);
    r.select()
    r.execCommand('Copy');
}

5

Mi sembra di aver letto male la domanda, ma per riferimento, puoi estrarre una gamma del DOM (non negli appunti; compatibile con tutti i browser moderni) e combinarlo con gli eventi oncopy e onpaste e onbeforepaste per ottenere il comportamento degli appunti. Ecco il codice per raggiungere questo obiettivo:

function clipBoard(sCommand) {
  var oRange=contentDocument.createRange();
  oRange.setStart(startNode, startOffset);
  oRange.setEnd(endNode, endOffset);
/* This is where the actual selection happens.
in the above, startNode and endNode are dom nodes defining the beginning 
and end of the "selection" respectively. startOffset and endOffset are 
constants that are defined as follows:

END_TO_END: 2
END_TO_START: 3
NODE_AFTER: 1
NODE_BEFORE: 0
NODE_BEFORE_AND_AFTER: 2
NODE_INSIDE: 3
START_TO_END: 1
START_TO_START: 0

and would be used like oRange.START_TO_END */
      switch(sCommand) {
    case "cut":
          this.oFragment=oRange.extractContents();
      oRange.collapse();
      break;
    case "copy":
      this.oFragment=oRange.cloneContents();
      break;
    case "paste":
      oRange.deleteContents();
      var cloneFragment=this.oFragment.cloneNode(true)
      oRange.insertNode(cloneFragment);
      oRange.collapse();
      break;
  }
}

1
in realtà ho corretto il codice. Funziona in tutti i browser ma in realtà non viene copiato negli Appunti. Estrae (taglia), clona (copia) il contenuto attraverso le variabili. Sembra che avevo dimenticato l'uso.
mrBorna,

5

Colpa mia. Funziona solo con IE.

Ecco ancora un altro modo per copiare il testo:

<p>
    <a onclick="window.clipboardData.setData('text', document.getElementById('Test').innerText);">Copy</a>
</p>

9
Questo non funziona nell'attuale Chrome (V31) o FireFox (v25). L'errore è che window.clipboardData non è definito. Tra i lati positivi, funziona in IE9. Quindi, fintanto che non ti interessano i browser buoni e vuoi bloccare il tuo sito nell'uso di quelli cattivi, questo è il modo per farlo!
Anthony,

2
non capisco perché così tante risposte sciocche. w3schools.com/howto/tryit.asp?filename=tryhow_js_copy_clipboard
Martian2049

5

Questa è stata l'unica cosa su cui abbia mai lavorato, dopo aver cercato in vari modi su Internet. Questo è un argomento disordinato. Esistono molte soluzioni pubblicate in tutto il mondo e la maggior parte di esse non funziona. Questo ha funzionato per me:

NOTA: questo codice funzionerà solo se eseguito come codice sincrono diretto su qualcosa come un metodo "onClick". Se si chiama in risposta asincrona ad Ajax o in qualsiasi altro modo asincrono, non funzionerà.

copyToClipboard(text) {
    var copyText = document.createElement("input");
    copyText.type = "text";
    document.body.appendChild(copyText);
    copyText.style = "display: inline; width: 1px;";
    copyText.value = text;
    copyText.focus();
    document.execCommand("SelectAll");
    document.execCommand("Copy");
    copyText.remove();
}

Mi rendo conto che questo codice mostrerà visibilmente sullo schermo un componente largo 1 pixel per un millisecondo, ma ho deciso di non preoccuparmi di ciò, che è qualcosa che gli altri possono affrontare se un problema reale.


5

Per copiare un testo selezionato ('Testo da copiare') negli Appunti, crea un Bookmarklet (segnalibro del browser che esegue JavaScript) ed eseguilo (fai clic su di esso). Creerà una textarea temporanea.

Codice da GitHub:

https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d

(function (text) {
  var node = document.createElement('textarea');
  var selection = document.getSelection();

  node.textContent = text;
  document.body.appendChild(node);

  selection.removeAllRanges();
  node.select();
  document.execCommand('copy');

  selection.removeAllRanges();
  document.body.removeChild(node);
})('Text To Copy');
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.