Kopieren Sie die Ausgabe einer JavaScript-Variablen in die Zwischenablage

77

Ich habe keine Kenntnisse in JavaScript, aber ich habe es geschafft, diesen Code mithilfe von Bits und Bolzen aus verschiedenen Antworten zum Stapelüberlauf zusammenzusetzen. Es funktioniert einwandfrei und gibt über ein Warnfeld ein Array aller ausgewählten Kontrollkästchen in einem Dokument aus.

function getSelectedCheckboxes(chkboxName) {
  var checkbx = [];
  var chkboxes = document.getElementsByName(chkboxName);
  var nr_chkboxes = chkboxes.length;
  for(var i=0; i<nr_chkboxes; i++) {
    if(chkboxes[i].type == 'checkbox' && chkboxes[i].checked == true) checkbx.push(chkboxes[i].value);
  }
  return checkbx;
}

Und um es zu nennen, benutze ich:

<button id="btn_test" type="button" >Check</button>
<script>
    document.getElementById('btn_test').onclick = function() {
        var checkedBoxes = getSelectedCheckboxes("my_id");
        alert(checkedBoxes);
    }
</script>

Jetzt möchte ich es so ändern, dass beim Klicken auf die btn_testSchaltfläche das Ausgabearray checkbxin die Zwischenablage kopiert wird. Ich habe versucht hinzuzufügen:

checkbx = document.execCommand("copy");

oder

checkbx.execCommand("copy");

am Ende der Funktion und dann aufrufen wie:

<button id="btn_test" type="button" onclick="getSelectedCheckboxes('my_id')">Check</button>

Aber es funktioniert nicht. Es werden keine Daten in die Zwischenablage kopiert.

Harman
quelle
Ich bezweifle, dass Sie ein unformatiertes JS-Objekt in die Zwischenablage kopieren können. .execCommand('copy')kopiert eine Auswahl auf einer Seite (falls in den Benutzereinstellungen zulässig). Sie können versuchen, das Array zu stringifizieren, dann einen Textbereich damit zu füllen, alle aus dem Textbereich auszuwählen und dann mit zu kopieren execCommand. Erfassen Sie beim Einfügen das Ereignis und analysieren Sie den Inhalt zurück in das Array.
Teemu
OK .. Danke, dass du mich auf eine Richtung hingewiesen hast. Ich dachte, dass dies wahrscheinlich nicht möglich war, da es keine direkten Suchergebnisse zu liefern schien. Ich werde also versuchen, das zu tun, was Sie vorgeschlagen haben.
Harman
Dies ist vielleicht eine dumme Frage, aber wo / wie würden Sie ein rohes JS-Objekt einfügen?
Teemu
Nun, im Grunde ist dies für ein WordPress-Ding. Ich sammle nur alle Elemente, deren ID = eine ID, um dann die durch Kommas getrennten IDs in WordPress-bedingte Tags einzufügen. Hoffe das macht Sinn ..
Harman
Korrektur, um Sinn zu machen ... Ich sammle alle Elemente, die aktiviert wurden und NICHT deren ID = eine ID ... ;-)
harman

Antworten:

104
function copyToClipboard(text) {
    var dummy = document.createElement("textarea");
    // to avoid breaking orgain page when copying more words
    // cant copy when adding below this code
    // dummy.style.display = 'none'
    document.body.appendChild(dummy);
    //Be careful if you use texarea. setAttribute('value', value), which works with "input" does not work with "textarea". – Eduard
    dummy.value = text;
    dummy.select();
    document.execCommand("copy");
    document.body.removeChild(dummy);
}
copyToClipboard('hello world')
copyToClipboard('hello\nworld')
Walkman
quelle
1
Seien Sie vorsichtig, wenn Sie Texarea verwenden. setAttribute ('value', value) funktioniert nicht damit.
Eduard
@Wie kopiere ich den String nicht mit \n?
qg_java_17137
2
Funktioniert das in Chrome für irgendjemanden? Ich bin in v70 + und es gibt keine Fehler, aber es wird auch nicht kopiert. Funktioniert im IE.
ScottLenart
Aus irgendeinem Grund musste ich .textContentstatt verwenden .value.
Mythofechelon
Funktioniert in Firefox 79.0, Chrome 84.0, IE 11, Edge 44 (unter Windows 10).
NoJoshua
38

OK, ich fand etwas Zeit und folgte dem Vorschlag von Teemu und konnte genau das bekommen, was ich wollte.

Hier ist der endgültige Code für alle, die interessiert sein könnten. Zur Verdeutlichung ruft dieser Code alle aktivierten Kontrollkästchen einer bestimmten ID ab, gibt sie in einem hier genannten Array aus checkbxund kopiert dann ihren eindeutigen Namen in die Zwischenablage.

JavaScript-Funktion:

function getSelectedCheckboxes(chkboxName) {
  var checkbx = [];
  var chkboxes = document.getElementsByName(chkboxName);
  var nr_chkboxes = chkboxes.length;
  for(var i=0; i<nr_chkboxes; i++) {
    if(chkboxes[i].type == 'checkbox' && chkboxes[i].checked == true) checkbx.push(chkboxes[i].value);
  }
  checkbx.toString();

  // Create a dummy input to copy the string array inside it
  var dummy = document.createElement("input");

  // Add it to the document
  document.body.appendChild(dummy);

  // Set its ID
  dummy.setAttribute("id", "dummy_id");

  // Output the array into it
  document.getElementById("dummy_id").value=checkbx;

  // Select it
  dummy.select();

  // Copy its contents
  document.execCommand("copy");

  // Remove it as its not needed anymore
  document.body.removeChild(dummy);
}

Und sein HTML-Aufruf:

<button id="btn_test" type="button" onclick="getSelectedCheckboxes('ID_of_chkbxs_selected')">Copy</button>
Harman
quelle
8
Könnte dies ohne Erstellen eines HTML-Elements erfolgen? Angenommen, ich wollte nur eine Zeichenfolge in die Zwischenablage eines Benutzers kopieren, wenn dieser auf eine Schaltfläche oder ein vordefiniertes Element klickt.
VikingGoat
6
Ich würde empfehlen, einen "Textbereich" anstelle einer "Eingabe" zu verwenden, damit Sie auch Zeilenumbrüche kopieren können.
Telmo Trooper
20

Für allgemeine Zwecke zum Kopieren von Text in die Zwischenablage habe ich die folgende Funktion geschrieben:

function textToClipboard (text) {
    var dummy = document.createElement("textarea");
    document.body.appendChild(dummy);
    dummy.value = text;
    dummy.select();
    document.execCommand("copy");
    document.body.removeChild(dummy);
}

Der Wert des Parameters wird in den Wert eines neu erstellten Parameters eingefügt <textarea>, der dann ausgewählt, in die Zwischenablage kopiert und dann aus dem Dokument entfernt wird.

Peter Paulovics
quelle
1
Seien Sie vorsichtig, wenn Sie Texarea verwenden. setAttribute ('value', value), das mit "input" funktioniert, funktioniert nicht mit "textarea".
Eduard
15

Sehr hilfreich. Ich habe es geändert, um einen JavaScript-Variablenwert in die Zwischenablage zu kopieren:

function copyToClipboard(val){
    var dummy = document.createElement("input");
    dummy.style.display = 'none';
    document.body.appendChild(dummy);

    dummy.setAttribute("id", "dummy_id");
    document.getElementById("dummy_id").value=val;
    dummy.select();
    document.execCommand("copy");
    document.body.removeChild(dummy);
}
lbrutti
quelle
5
change $ (Dummy) .css ('display', 'none'); in dummy.style.display = 'none'; um jQuery zu vermeiden
Kardi Teknomo
4
In Chrome muss ein Dummy angezeigt werden. Also habe ich eine Zeile des Codes entfernt und es funktioniert, danke
shukshin.ivan
1
@ shukshin.ivan danke für diesen Beitrag! Am Ende habe ich diese Zeile in folgende geändert: dummy.setAttribute("hidden", true);true kann alles sein, da die HTML-Syntax für das versteckte Attribut keinen Wert hat.
Jimmy Westberg
Ich habe auch eine einfache Überprüfung durchgeführt, ob der gesendete "Wert" ein Objekt ist, wenn ja, stringifizieren:if (typeof stuffToAddToClipboard === "object") { stuffToAddToClipboard = JSON.stringify(stuffToAddToClipboard); }
Jimmy Westberg
Hallo, kann jemand das Downvoting erklären? Ich kann keine klaren Gründe in meiner Antwort sehen ...
lbrutti
5

Ich habe es geschafft, Text in die Zwischenablage zu kopieren ( ohne Textfelder anzuzeigen ), indem ich ein verstecktes input Element hinzugefügt habe body, dh:

 function copy(txt){
  var cb = document.getElementById("cb");
  cb.value = txt;
  cb.style.display='block';
  cb.select();
  document.execCommand('copy');
  cb.style.display='none';
 }
<button onclick="copy('Hello Clipboard!')"> copy </button>
<input id="cb" type="text" hidden>

Pedro Lobito
quelle
1
Es hat bei mir funktioniert, aber nur ohne "verstecktes" Attribut für die Eingabe. In Chromium wird ein Stil "display: none! Important" erzwungen, der nicht durch manuelles Setzen von "display: block" in Zeile 4 Ihres Skripts überschrieben wird.
II PFEILE
Seltsamerweise scheitert dies für mich weiterhin. Wenn ich stattdessen versuche einzufügen, wird nur der alte Text in die Zwischenablage eingefügt. Ist das ein bekanntes Problem?
Destaq
3

Zum Zeitpunkt des Schreibens hat das Einstellen display:nonedes Elements bei mir nicht funktioniert . Das Setzen der Breite und Höhe des Elements auf 0 hat ebenfalls nicht funktioniert. Das Element muss also mindestens sein1px breit sein, damit dies funktioniert.

Das folgende Beispiel hat in Chrome und Firefox funktioniert:

    const str = 'Copy me';
    const el = document.createElement("input");
    // Does not work:
    // dummy.style.display = "none";
    el.style.height = '0px';
    // Does not work:
    // el.style.width = '0px';
    el.style.width = '1px';
    document.body.appendChild(el);
    el.value = str;
    el.select();
    document.execCommand("copy");
    document.body.removeChild(el);

Ich möchte hinzufügen, dass ich sehen kann, warum die Browser versuchen, diesen hackigen Ansatz zu verhindern. Es ist besser, den Inhalt, den Sie kopieren möchten, offen im Browser des Benutzers anzuzeigen. Aber manchmal gibt es Designanforderungen, die wir nicht ändern können.

sr9yar
quelle
0

Ich möchte nur hinzufügen, wenn jemand zwei verschiedene Eingaben in die Zwischenablage kopieren möchte. Ich habe auch die Technik verwendet, es in eine Variable einzufügen und dann den Text der Variablen aus den beiden Eingaben in einen Textbereich einzufügen.

Hinweis: Der folgende Code stammt von einem Benutzer, der fragt, wie mehrere Benutzereingaben in die Zwischenablage kopiert werden sollen. Ich habe es gerade repariert, damit es richtig funktioniert. Erwarten Sie also einen alten Stil wie die Verwendung von varanstelle von letoder const. Ich empfehle auch, addEventListenerfür die Schaltfläche zu verwenden.

    function doCopy() {

        try{
            var unique = document.querySelectorAll('.unique');
            var msg ="";

            unique.forEach(function (unique) {
                msg+=unique.value;
            });

            var temp =document.createElement("textarea");
            var tempMsg = document.createTextNode(msg);
            temp.appendChild(tempMsg);

            document.body.appendChild(temp);
            temp.select();
            document.execCommand("copy");
            document.body.removeChild(temp);
            console.log("Success!")


        }
        catch(err) {

            console.log("There was an error copying");
        }
    }
<input type="text" class="unique" size="9" value="SESA / D-ID:" readonly/>
<input type="text" class="unique" size="18" value="">
<button id="copybtn" onclick="doCopy()"> Copy to clipboard </button>

Richard Ramos
quelle
0

Heutzutage gibt es eine neue (ish) API , um dies direkt zu tun. Es funktioniert nur in modernen Browsern und unter HTTPS (und localhost). Wird von IE11 nicht unterstützt.

IE11 hat eine eigene API.

Die Problemumgehung in der akzeptierten Antwort kann für unsichere Hosts verwendet werden.

function copyToClipboard (text) {
  if (navigator.clipboard) { // default: modern asynchronous API
    return navigator.clipboard.writeText(text);
  } else if (window.clipboardData && window.clipboardData.setData) {     // for IE11
    window.clipboardData.setData('Text', text);
    return Promise.resolve();
  } else {
    // workaround: create dummy input
    const input = h('input', { type: 'text' });
    input.value = text;
    document.body.append(input);
    input.focus();
    input.select();
    document.execCommand('copy');
    input.remove();
    return Promise.resolve();
  }
}

Hinweis: Zum Erstellen des Eingabeelements wird Hyperscript verwendet (sollte jedoch leicht anzupassen sein).

Die Eingabe muss nicht unsichtbar gemacht werden, da sie so schnell hinzugefügt und entfernt wird. Auch wenn sie versteckt sind (selbst mit einer cleveren Methode), erkennen einige Browser dies und verhindern den Kopiervorgang.

Pierre Henry
quelle