将JavaScript变量的输出复制到剪贴板


77

我不了解JavaScript,但是我设法使用各种Stack Overflow答案中的点点滴滴将这些代码放在一起。它工作正常,并通过警报框输出文档中所有选中复选框的数组。

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

并称之为:

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

现在,我想对其进行修改,以便在单击btn_test按钮时将输出数组checkbx复制到剪贴板。我尝试添加:

checkbx = document.execCommand("copy");

要么

checkbx.execCommand("copy");

在函数的末尾,然后像这样调用它:

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

但这行不通。没有数据复制到剪贴板。


我怀疑您可以将原始JS对象复制到剪贴板。.execCommand('copy')将选择内容复制到页面上(如果用户首选项允许)。您可以尝试对数组进行字符串化,然后用它填充文本区域,从textarea中选择全部,然后使用复制execCommand。粘贴时,捕获事件,然后将内容解析回数组。
Teemu

好..感谢您为我指明方向。我认为这可能是不可能的,因为它似乎未返回任何直接搜索结果。所以我想我会按照您的建议去做。
哈曼2015年

这可能是一个愚蠢的问题,但是您将在何处粘贴原始的JS对象?
Teemu

好吧,基本上这是针对wordpress的东西。我只是收集ID =一些id的所有元素,然后将逗号分隔的ID粘贴到wordpress条件标签中。希望这是有道理的..
harman 2015年

为了合理起见,进行更正...我正在收集所有已选中复选框的元素,而不是其ID =某些ID ... ;-)
harman

Answers:


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

1
如果使用德克萨斯州,请小心。setAttribute('value',value)不起作用。
爱德华

@如何复制字符串\n
qg_java_17137 '18

2
Chrome浏览器对所有人都有效吗?我在v70 +中,它不会引发任何错误,但是也不会复制任何错误。在IE中工作。
ScottLenart '18

由于某种原因,我不得不使用.textContent代替.value
mythofechelon

适用于Firefox 79.0,Chrome 84.0,IE 11,Edge 44(在Windows 10上)。
NoJoshua

38

好的,我花了一些时间并听从了Teemu的建议,我完全能够得到我想要的。

因此,这是任何有兴趣的人的最终代码。为了澄清起见,此代码获取某个ID的所有选中复选框,将它们输出到一个名为here的数组中,checkbx然后将其唯一名称复制到剪贴板。

JavaScript函数:

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

及其HTML调用:

<button id="btn_test" type="button" onclick="getSelectedCheckboxes('ID_of_chkbxs_selected')">Copy</button>

8
可以在不创建HTML元素的情况下完成此操作吗?比如说我只是想在用户单击按钮或预先指定的元素时将字符串复制到用户剪贴板?
VikingGoat '16

6
我建议使用“文本区域”而不是“输入”,这样您也可以复制换行符。
Telmo士兵

20

为了将任何文本复制到剪贴板,我编写了以下函数:

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

参数的值插入到新创建的的值中<textarea>,然后将其选中,将其值复制到剪贴板,然后将其从文档中删除。


1
如果使用德克萨斯州,请小心。setAttribute('value',value),与“ input”一起使用,不适用于“ textarea”。
爱德华

15

很有用。我修改了它以将JavaScript变量值复制到剪贴板:

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

5
更改$(dummy).css('display','none'); 进入dummy.style.display ='none'; 避免使用jQuery
Kardi Teknomo '19

4
Chrome需要显示虚拟对象。因此,我删除了一行代码,它可以正常工作,谢谢
shukshin.ivan,

1
@ shukshin.ivan感谢您的输入!我确实将那行更改为:dummy.setAttribute("hidden", true);true可以是任何值,因为hidden属性的html语法没有任何值。
吉米·韦斯特伯格

我还简单检查了发送的“值”是否是一个对象,如果是如此字符串化:if (typeof stuffToAddToClipboard === "object") { stuffToAddToClipboard = JSON.stringify(stuffToAddToClipboard); }
Jimmy Westberg,

你好,有人可以解释一下投票否决吗?我在回答
中看


5

我设法通过将隐藏元素添加到来将文本复制到剪贴板(不显示任何文本框),即: inputbody

 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>


1
它对我有用,但仅在输入中没有“隐藏”属性。在Chromium中,它会强制设置样式“ display:none!important”,该样式不会通过在脚本的第4行上手动设置“ display:block”来覆盖。
II ARROWS

奇怪的是,这对我来说仍然失败。相反,当我尝试粘贴时,它只是将旧文本粘贴到剪贴板中。这是一个已知的问题?
Destaq

3

在撰写本文时,设置display:none元素对我不起作用。将元素的宽度和高度设置为0也不起作用。因此,该元素必须至少1px在宽度上才能工作。

以下示例适用于Chrome和Firefox:

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

我想补充一点,我可以看到为什么浏览器试图阻止这种骇人听闻的方法。最好将要复制的内容公开显示到用户的浏览器中。但是有时候有设计要求,我们不能改变。


0

我只是想添加,如果有人想将两个不同的输入复制到剪贴板。我还使用了将其放入变量的技术,然后将来自两个输入的变量的文本放入文本区域。

注意:以下代码来自某个用户,询问如何将多个用户输入复制到剪贴板。我只是修复它才能正常工作。因此,请期待一些旧样式,例如使用var代替letconst。我也建议使用addEventListener按钮。

    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>


0

如今,有一个新的(ish)API可以直接执行此操作。它仅适用于现代浏览器和HTTPS(和localhost)。IE11不支持。

IE11有自己的API。

并且可以将接受的答案中的解决方法用于不安全的主机。

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

注意:它使用Hyperscript创建输入元素(但应易于调整)

由于输入和输入是如此之快,因此不需要使输入不可见。同样,即使隐藏(即使使用某些巧妙的方法),某些浏览器也会检测到它并阻止复制操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.