Hoe kopieer ik naar het klembord in JavaScript?

Wat is de beste manier om tekst naar het klembord te kopiëren (multi-browser)?

Ik heb geprobeerd:

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

Maar in Internet Explorer geeft het een syntaxisfout. In Firefox staat unsafeWindow is niet gedefinieerd.

Een leuke truc zonder Flash: Hoe krijgt Trello toegang tot het klembord van de gebruiker?


Antwoord 1, autoriteit 100%

Overzicht

Er zijn drie primaire browser-API’s om naar het klembord te kopiëren:

  1. Asynchrone klembord-API[navigator.clipboard.writeText]

    • Op tekst gericht gedeelte beschikbaar in Chrome 66 (maart 2018)
    • Toegang is asynchroon en maakt gebruik van JavaScript-beloftes, zodat de beveiligingsgebruiker prompts (indien weergegeven) onderbreken het JavaScript op de pagina niet.
    • Tekst kan rechtstreeks vanuit een variabele naar het klembord worden gekopieerd.
    • Alleen ondersteund op pagina’s die worden weergegeven via HTTPS.
    • In Chrome 66-pagina’s kunnen inactieve tabbladen naar het klembord schrijven zonder een toestemmingsprompt.
  2. document.execCommand('copy')

    • De meeste browsers ondersteunen dit vanaf ~ april 2015 (zie Browserondersteuning hieronder).
    • Toegang is synchroon, d.w.z. stopt JavaScript op de pagina totdat deze is voltooid, inclusief weergave en gebruikersinteractie met eventuele beveiligingsvragen.
    • Tekst wordt gelezen uit de DOM en op het klembord geplaatst.
    • Tijdens het testen van ~ april 2015 werd alleen opgemerkt dat Internet Explorer toestemmingsprompts weergaf tijdens het schrijven naar het klembord.
  3. De kopieergebeurtenis overschrijven

    • Zie de Clipboard API-documentatie over De kopieergebeurtenis overschrijven.
    • Hiermee kunt u wijzigen wat er op het klembord wordt weergegeven vanuit elke kopieergebeurtenis, kan andere gegevensindelingen bevatten dan platte tekst.
    • Hier niet behandeld omdat het de vraag niet direct beantwoordt.

Algemene ontwikkelingsopmerkingen

Verwacht niet dat aan het klembord gerelateerde opdrachten werken terwijl u code in de console test. Over het algemeen moet de pagina actief zijn (Async Clipboard API) of is er interactie van de gebruiker vereist (bijv. een gebruikersklik) om (document.execCommand('copy')) toegang te geven tot het klembord, zie hieronder voor meer details.

BELANGRIJK(hier vermeld 20/02/20)

Merk op dat aangezien dit bericht oorspronkelijk is geschreven beëindiging van machtigingen in cross-origin IFRAME’sen andere IFRAME “sandboxing”voorkomt dat de ingesloten demo’s “Run code snippet”-knoppen en “codepen.io example” in sommige browsers (inclusief Chrome en Microsoft Edge) werken.

Als u uw eigen webpagina wilt ontwikkelen, dient u die pagina weer te geven via een HTTPS-verbinding om te testen en ertegen te ontwikkelen.

Hier is een test-/demopagina die de werking van de code laat zien:
https://deanmarktaylor.github.io/clipboard-test/

Async + terugval

Vanwege het niveau van browserondersteuning voor de nieuwe Async Clipboard API, wilt u waarschijnlijk terugvallen op de document.execCommand('copy')-methode om een goede browserdekking te krijgen.

p>

Hier is een eenvoudig voorbeeld (werkt mogelijk niet ingesloten in deze site, lees de “belangrijke” opmerking hierboven):

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>

Antwoord 2, autoriteit 48%

Automatisch kopiëren naar het klembord kan gevaarlijk zijn en daarom maken de meeste browsers (behalve Internet Explorer) het erg moeilijk. Persoonlijk gebruik ik de volgende eenvoudige truc:

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

De gebruiker krijgt het promptvenster te zien, waar de te kopiëren tekst al is geselecteerd. Nu volstaat het om op Ctrl+ Cen Enterte drukken (om het vak te sluiten) — en voila!

De kopieerbewerking op het klembord is nu veilig, omdat de gebruiker dit handmatig doet (maar op een vrij eenvoudige manier). Het werkt natuurlijk in alle browsers.

<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>

Antwoord 3, autoriteit 15%

De volgende aanpak werkt in Chrome, Firefox, Internet Explorer en Edge, en in recente versies van Safari (kopieerondersteuning is toegevoegd in versie 10 die in oktober 2016 werd uitgebracht).

  • Maak een tekstgebied en stel de inhoud in op de tekst die u naar het klembord wilt kopiëren.
  • Voeg het tekstgebied toe aan de DOM.
  • Selecteer de tekst in het tekstgebied.
  • Bel document.execCommand(“copy”)
  • Verwijder het tekstgebied van de dom.

Opmerking: u zult het tekstgebied niet zien, omdat het wordt toegevoegd en verwijderd binnen dezelfde synchrone aanroep van Javascript-code.

Enkele dingen waar u op moet letten als u dit zelf implementeert:

  • Om veiligheidsredenen kan dit alleen worden aangeroepen vanuit een gebeurtenishandler zoals click (net als bij het openen van vensters).
  • Internet Explorer toont een toestemmingsdialoogvenster wanneer het klembord voor het eerst wordt bijgewerkt.
  • Internet Explorer en Edge zullen scrollen wanneer het tekstgebied is gefocust.
  • execCommand() kan in sommige gevallen iets opleveren.
  • Nieuwe regels en tabbladen kunnen worden ingeslikt, tenzij u een tekstgebied gebruikt. (De meeste artikelen lijken het gebruik van een div aan te bevelen)
  • Het tekstgebied is zichtbaar terwijl het dialoogvenster van Internet Explorer wordt weergegeven. U moet het ofwel verbergen of de specifieke ClipboardData API van Internet Explorer gebruiken.
  • In Internet Explorer kunnen systeembeheerders de klembord-API uitschakelen.

De onderstaande functie moet alle volgende problemen zo netjes mogelijk afhandelen. Laat een reactie achter als je problemen tegenkomt of suggesties hebt om het te verbeteren.

// 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 window.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/


Antwoord 4, autoriteit 5%

Hier is mijn mening over die…

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: Houd er rekening mee dat het gebruik van het html input-veld geen regelafbrekingen \nrespecteert en alle tekst tot een enkele regel zal afvlakken.

Zoals vermeld door @nikksan in de opmerkingen, zal het gebruik van textareahet probleem als volgt oplossen:

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

Antwoord 5, autoriteit 3%

Het lezen en wijzigen van het klembord van een webpagina roept veiligheids- en privacyproblemen op. In Internet Explorer is het echter mogelijk om het te doen. Ik heb dit voorbeeldfragmentgevonden:

   <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" />

Antwoord 6, Autoriteit 3%

Als u een echt eenvoudige oplossing wilt (duurt minder dan 5 minuten om te integreren) en ziet er goed uit de doos, dan Clippy is een leuk alternatief voor sommige van de complexere oplossingen.

Het is geschreven door een cofounder van GitHub. Voorbeeld Flash Embed Code hieronder:

<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>

Vergeet niet om #{text}te vervangen door de tekst die u wilt kopiëren, en #{bgcolor}door een kleur.


Antwoord 7, autoriteit 3%

Ik heb onlangs een technische blog geschreven postover ditzelfde probleem (ik werk bij Lucidchart en we hebben onlangs een revisie op ons klembord uitgevoerd).

Het kopiëren van platte tekst naar het klembord is relatief eenvoudig, ervan uitgaande dat u dit probeert te doen tijdens een systeemkopieergebeurtenis (gebruiker drukt op Ctrl+ Cof gebruikt het browsermenu) .

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

Het is veel moeilijker om tekst op het klembord te plaatsen, niet tijdens een systeemkopiegebeurtenis. Het lijkt erop dat sommige van deze andere antwoorden verwijzen naar manieren om het via Flash te doen, wat de enige manier is om dit via verschillende browsers te doen (voor zover ik begrijp).

Anders dan dat, zijn er enkele opties per browser.

Dit is het eenvoudigst in Internet Explorer, waar u op elk moment vanuit JavaScript toegang hebt tot het clipboardData-object via:

window.clipboardData

(Als u dit echter probeert te doen buiten een knip-, kopieer- of plakgebeurtenis van het systeem, vraagt Internet Explorer de gebruiker om toestemming voor het klembord van de webtoepassing.)

In Chrome kunt u een Chrome-extensie maken die u klembordrechtengeeft (dit is wat we doen voor Lucidchart). Voor gebruikers met uw extensie geïnstalleerd, hoeft u alleen de systeemgebeurtenis zelf te activeren:

document.execCommand('copy');

Het lijkt erop dat Firefox enkele optiesheeft waarmee gebruikers toestemming kunnen verlenen aan bepaalde sites om toegang te krijgen tot het klembord , maar ik heb geen van deze persoonlijk geprobeerd.


Antwoord 8, autoriteit 3%

Ik vind deze leuk:

<input onclick="this.select();" type='text' value='copy me' />

Als een gebruiker niet weet hoe hij tekst in zijn besturingssysteem moet kopiëren, weet hij waarschijnlijk ook niet hoe hij moet plakken. Laat het dus gewoon automatisch selecteren en laat de rest over aan de gebruiker.


Antwoord 9, autoriteit 2%

clipboard.jsis een klein, niet-Flash, hulpprogramma dat het kopiëren van tekst of HTML-gegevens naar het klembord. Het is heel gemakkelijk te gebruiken, voeg gewoon de .js toe en gebruik zoiets als dit:

<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>

klembord.js staat ook op Github .

Opmerking: Dit is nu verouderd. Migreren naar hier .


Antwoord 10

In 2018 is hier hoe u erover kunt gaan:

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

het wordt gebruikt in mijn hoekige 6+ code zoals SO:

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

Als ik in een string passeer, kopieert het het. Als niets, kopieert het de URL van de pagina.

Meer gymnastiek naar het klembordstukken kunnen ook worden gedaan. Zie hier meer informatie:

Deblokkeren Klembord Toegang


Antwoord 11

Ik gebruik dit zeer succesvol (zonder jQuery of een ander raamwerk).

function copyToClp(txt){
    var m = document;
    txt = m.createTextNode(txt);
    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();
}

WAARSCHUWING

Tabbladen worden geconverteerd naar spaties (althans in chroom).


Antwoord 12

Zeroclipboard is de beste cross-browser-oplossing die ik heb gevonden:

<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>

Als u niet-flash-ondersteuning voor iOS nodig heeft, voegt u gewoon een val terug:

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


Antwoord 13

Aangezien Chrome 42+ en Firefox 41+ nu de opdracht document.execCommand(‘copy’)ondersteunen, heb ik een aantal functies gemaakt voor het kopiëren naar het klembord in meerdere browsers met behulp van een combinatie van Tim Downs oude antwoorden Antwoord van Google-ontwikkelaar:

function selectElementContents(el) {
    // Copy textarea, pre, div, etc.
    if (document.body.createTextRange) {
        // Internet Explorer
        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>

Antwoord 14

Van een van de projecten waar ik aan heb gewerkt, een jQuery copy-to-clipboard-plug-in die gebruikmaakt van de ZeroClipboardbibliotheek.

Het is gemakkelijker te gebruiken dan de native Zero Clipboard-plug-in als je een zware jQuery-gebruiker bent.


Antwoord 15

   $("td").click(function (e) {
        var clickedCell = $(e.target).closest("td");
        navigator.clipboard.writeText(clickedCell.text());
        alert(clickedCell.text());
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
<tr>
<td>First<td>
</tr>
<tr>
<td>Second<td>
</tr>
<tr>
<td>Third<td>
</tr>
<tr>
<td>Fourth<td>
</tr>
</table>

Antwoord 16

Ik heb samengesteld wat ik denk dat het beste is.

  • Gebruikt cssText om uitzonderingen in Internet Explorer te voorkomen in plaats van rechtstreeks op te maken.
  • Herstelt de selectie als die er was
  • Stelt alleen-lezen in zodat het toetsenbord niet verschijnt op mobiele apparaten
  • Heeft een tijdelijke oplossing voor iOS zodat het echt werkt zoals het normaal execCommand blokkeert.

Hier is het:

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 programmatic execCommand copying normally, without this hack.
    // https://stackoverflow.com/questions/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;
    }
  };
})();

Gebruik: copyToClipboard('some text')


Antwoord 17

De andere methoden zullen platte tekst naar het klembord kopiëren. Om HTML te kopiëren (d.w.z. u kunt de resultaten in een WYSIWYG-editor plakken), kunt u het volgende doen in Internet Explorer alleen. Dit is fundamenteel anders dan de andere methoden, omdat de browser de inhoud daadwerkelijk zichtbaar selecteert.

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

Antwoord 18

Ik heb de volgende oplossing gevonden:

De on-key-down-handler maakt een “pre”-tag. We stellen de inhoud in om naar deze tag te kopiëren, maken vervolgens een selectie op deze tag en retourneren true in de handler. Dit roept de standaard handler van Chrome aan en kopieert geselecteerde tekst.

En als je het nodig hebt, kun je de time-out instellen voor een functie voor het herstellen van de vorige selectie. Mijn implementatie op 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 did 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('Failed to paste. :(');
    };
}

Gebruik:

enyby_clip = new EnybyClipboard(); // Init
enyby_clip.copyText('some_text'); // Place this in the 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;

Op plakken maakt het een textarea en werkt op dezelfde manier.

PS: Misschien kan deze oplossing worden gebruikt voor het maken van een volledige cross-browser-oplossing zonder flits. Het werkt in Firefox en Chrome.


Antwoord 19

Deze code getest @ 2021 mei. Werk aan chroom, dwz, rand. ‘Message’-parameter hieronder is de stringwaarde die u wilt kopiëren.

<script type="text/javascript">
    function copyToClipboard(message) {
        var textArea = document.createElement("textarea");
        textArea.value = message;
        textArea.style.opacity = "0"; 
        document.body.appendChild(textArea);
        textArea.focus();
        textArea.select();
        try {
            var successful = document.execCommand('copy');
            var msg = successful ? 'successful' : 'unsuccessful';
            alert('Copying text command was ' + msg);
        } catch (err) {
            alert('Unable to copy value , error : ' + err.message);
        }
        document.body.removeChild(textArea);
    }
</script>

Antwoord 20

Ik vond de volgende oplossing:

Ik heb de tekst in een verborgen input. Omdat setSelectionRangewerkt niet op verborgen ingangen, gewijzigd tijdelijk het type naar tekst, de tekst gekopieerd en maakte het vervolgens weer verborgen. Als u de tekst van een element wilt kopiëren, kunt u deze doorgeven aan de functie en de inhoud opslaan in de doelvariabele.

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

Antwoord 21

Er zijn al veel antwoorden, maar voeg er graag een toe (jQuery). Werkt prima in elke browser, ook op mobiele (d.w.z. vragen over beveiliging, maar als je akkoord gaat, werkt het gewoon prima).

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

In uw code:

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

Antwoord 22

Vanaf Flash 10 kunt u alleen naar het klembord kopiëren als de actie voortkomt uit gebruikersinteractie met een Flash-object. (Lees het gerelateerde gedeelte van de Flash 10-aankondiging van Adobe.)

De oplossing is om een Flash-object boven de knop Kopiëren te plaatsen, of welk element dan ook dat de kopie start. ZeroClipboard is momenteel de beste bibliotheek met deze implementatie. Ervaren Flash-ontwikkelaars willen misschien gewoon hun eigen bibliotheek maken.


Antwoord 23

Kopieer tekst van HTML-invoer naar het klembord:

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>

Antwoord 24

Dit is een beetje een combinatie tussen de andere antwoorden.

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

Het gebruikt jQuery, maar het hoeft natuurlijk niet te worden. Je kunt dat veranderen als je wilt. Ik had gewoon jQuery tot mijn beschikking. U kunt ook enkele CSS toevoegen om ervoor te zorgen dat de invoer niet wordt weergegeven. Zoiets als:

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

Of u kunt natuurlijk ook wat inline styling doen

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

Antwoord 25

Ik had hetzelfde probleem met het bouwen van een aangepast rasterbewerking van (zoiets als Excel) en compatibiliteit met Excel. Ik moest ondersteunen met het selecteren van meerdere cellen, kopiëren en plakken.

Oplossing: Maak een textarea waar u gegevens voor de gebruiker inzet om te kopiëren (voor mij wanneer de gebruiker cellen selecteert), stel de focus erop in (bijvoorbeeld wanneer gebruiker CTRL drukt en selecteer de hele tekst.

Dus, wanneer de gebruiker CTRL + C haalt, krijgt hij / zij gecoördineerde cellen die hij / zij heeft geselecteerd. Na het testen gewoon het gebruik van het Textarea op één pixel (ik heb niet getest als het werkt op display: Geen). Het werkt mooi op alle browsers, en het is transparant voor de gebruiker.

Plakken - je zou hetzelfde als deze kunnen doen (verschilt op je doelwit) - houd je focus op Textarea en Catch Pasta-gebeurtenissen met behulp van Onpaste (in mijn project gebruik ik Textareas in cellen om te bewerken).

Ik kan een voorbeeld (commercieel project) niet plakken, maar u krijgt het idee.


Antwoord 26

In andere browsers dan Internet & NBSP; Explorer U moet een klein flitserobject gebruiken om het klembord te manipuleren, b.v.


Antwoord 27

ik heb gebruikt clipboard.js.

We kunnen het op NPM:

npm install clipboard --save

En ook op Bower

bower install clipboard --save

Gebruik & amp; Voorbeelden zijn dan https://zenorocha.github.io/clipboard.js/ .


Antwoord 28

Om een ​​geselecteerde tekst ( 'Text To Copy') naar uw klembord kopiëren, maakt u een Bookmarklet (browser bladwijzer die JavaScript uitvoert) en voer het uit (klik erop). Het zal een tijdelijke textarea te maken.

Code van 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');

Antwoord 29

function copytoclipboard(element) {
    var $temp = $("<input>");
    $("body").append($temp);
    $temp.val('0' + element).select();
    document.execCommand("copy");
    $temp.remove();
}

ANTWOORD 30

Dit is een uitbreiding van Chase Seibert's antwoord, met het voordeel dat het werkt voor IMAGE- en TABLE-elementen, niet alleen voor DIV's op Internet Explorer 9.

if (document.createRange) {
    // Internet Explorer 9 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 Firefox
} else {
    // Internet Explorer 8 and earlier. This stuff won't work
    // on Internet Explorer 9.
    // (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');
}

Other episodes