使用jQuery/JavaScript复制文本框的值到剪贴板

7

我有一个文本框和按钮,长这样:

     <div class="col-xs-11" style="padding:20px 0 ">
     <input type="text" class="form-control txtKeywords" id="txtKeyw" style="margin-bottom:10px; height:45px;" maxlength="80" placeholder="Click on keywords to combine your title">
   <button type="submit" class="btn btn-space btn-success btn-shade4 btn-lg copyToClipboard">
    <i class="icon icon-left s7-mouse"></i> Copy to Clipboard
     /button>

当用户点击复制到剪贴板按钮时,我希望将文本框的内容复制到剪贴板中,操作步骤如下:

$(document).on("click", ".copyToClipboard", function () {
    copyToClipboard("txtKeyw");
    successMessage();
});

copyToClipboard函数的定义如下:

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

但是当我这样做时,没有任何反应——从文本框中没有复制任何值到剪贴板……我在这里做错了什么?

更多信息:

  • 这在Chrome 59 64位和Firefox 54 32位都会发生。
  • successMessage()被调用并显示在浏览器中。
  • 在元素ID前添加#不能解决问题。

@zuluk 我在 Chrome 和 Firefox 上测试了,都没有成功 :/ - User987
Chrome 43或更高版本和Firefox 41或更高版本? - zuluk
successMessage() 被调用了吗?copyToClipboard() 运行了吗? - freginold
@freginold 是的,我可以验证成功消息得到调用,并且在浏览器中显示... - User987
@freginold 也尝试使用 #,但仍然不起作用... - User987
显示剩余2条评论
4个回答

14

步骤1:更改您的copyToClipboard(element)如下:

function copyToClipboard(text) {

   var textArea = document.createElement( "textarea" );
   textArea.value = text;
   document.body.appendChild( textArea );       
   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',err);
   }    
   document.body.removeChild( textArea );
}

步骤2:为您的按钮赋予一个id,然后像这样为其添加一个事件监听器:

$( '#btnCopyToClipboard' ).click( function()
 {
     var clipboardText = "";
     clipboardText = $( '#txtKeyw' ).val(); 
     copyToClipboard( clipboardText );
     alert( "Copied to Clipboard" );
 });

它在日志中显示复制成功了...但是...当我尝试粘贴文本时,什么也没有;/ - User987
1
需要用 $( #txtKeyw ).val() 替换 $( #txtKeyw ).text() - User987
需要在 #txtKeyw 周围加上引号,对吗? - freginold
我根据评论编辑了答案。很抱歉,我自己没有尝试过,但希望我的答案能够给出应该如何做的想法。 - Virk Bilal
工作正常。代码中只有一个小错别字:第一个函数名必须从copyToClipboard重命名为copyTextToClipboard。谢谢! - Adrian Hernandez-Lopez
@User987 我知道这很久了,但你有解决这个问题吗?批准的答案对我不起作用。情况几乎完全相同。 - Mattaton

2
请试试这个方法,这是正确的方式。 步骤 1:
function copyToClipboard(text) {

   var textArea = document.createElement( "textarea" );
   textArea.value = text;
   document.body.appendChild( textArea );

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

步骤2:

$( '#btnCopyToClipboard' ).click( function()
 {
     var clipboardText = "";

     clipboardText = $( '#txtKeyw' ).val();

     copyToClipboard( clipboardText );
     alert( "Copied to Clipboard" );
 });

1

copyToClipboard()接受一个元素作为参数。 txtKeyw是id,你必须在它之前加上#


0

我相信 document.execCommand('copy') 现在已经被弃用了,在 Edge v 113.0 和 Opera v 98.0 上测试过。

请改用以下方法:

function copyToClipboard() {
  var txtField = document.getElementById('txt-field');
   txtField.select();
   navigator.clipboard.writeText(txtField.value);
  alert('Copied to clipboard!');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接