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

时间:2015-11-22 14:04:28

标签: javascript copy clipboard

我不了解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>

但它不起作用。没有数据被复制到剪贴板。

11 个答案:

答案 0 :(得分:42)

lbrutti对答案的看法很好,但他写错了代码!

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 :(得分:29)

好的,我找到了一些时间并遵循了Teemu的建议,我能够得到我想要的东西。

所以这里是可能感兴趣的任何人的最终代码。为了澄清,此代码获取特定ID的所有选中复选框,将其输出到数组中,在此处命名为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>

答案 2 :(得分:12)

非常有用。我修改它以将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);
}

答案 3 :(得分:10)

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

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>的值中,然后选择该值,将其值复制到剪贴板,然后将其从文档中删除。

答案 4 :(得分:2)

当您需要在Chrome开发者控制台中将变量复制到剪贴板时,只需使用copy()命令即可​​。

https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference#copyobject

答案 5 :(得分:1)

使用剪贴板 API

text = "HEllo World";
navigator.clipboard.writeText(text)

适用于 Chrome 66+、Edge 79+、Firefox 63+,不适用于 IE

查看这篇真实帖子 - Baby Wolf Codes

答案 6 :(得分: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>

答案 7 :(得分:0)

我设法通过向{{添加隐藏的 javascript元素,将input变量复制到剪贴板,不显示任何文本框 1}},即:

body
 function copy(txt){
  var cb = document.getElementById("cb");
  cb.value = txt;
  cb.style.display='block';
  cb.select();
  document.execCommand('copy');
  cb.style.display='none';
 }

答案 8 :(得分:0)

在撰写本文时,在元素上设置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);

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

答案 9 :(得分:0)

如今,有一个new(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创建输入元素(但应易于适应)

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

答案 10 :(得分:0)

function CopyText(toCopy, message) {
    var body = $(window.document.body);
    var textarea = $('<textarea/>');
    textarea.css({
        position: 'fixed',
        opacity: '0'
    });

    textarea.val(toCopy);
    body.append(textarea);
    textarea[0].select();

    try {
        var successful = document.execCommand('copy');
        if (!successful)
            throw successful;
        else
            alert(message);
    } catch (err) {
        window.prompt("Copy to clipboard: Ctrl+C, Enter", toCopy);
    }

    textarea.remove();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<button type="button" onClick="CopyText('Hello World', 'Text copped!!')">Copy</button>