如何使用JavaScript复制到剪贴板?

早过忘川 提交于 2019-12-06 06:48:31

将文本复制到剪贴板的最佳方法是什么? (多浏览器)

我试过了:

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

但是在Internet Explorer中,它会给出语法错误。 在Firefox中,它说unsafeWindow is not defined

一个没有闪光灯的好技巧: Trello如何访问用户的剪贴板?


#1楼

我发现以下解决方案:

在按下按键时,处理程序会创建“ pre”标签。 我们将内容设置为复制到此标签,然后在此标签上进行选择并在处理程序中返回true。 这将调用chrome的标准处理程序,并复制所选文本。

而且,如果需要,可以设置恢复先前选择功能的超时时间。 我在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 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('Fail to paste. :(');
     };
   }

用法:

enyby_clip = new EnybyClipboard(); //init 

enyby_clip.copyText('some_text'); // place this in 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;

在粘贴时,它会创建textarea并以相同的方式工作。

PS可能是此解决方案,可用于创建不带Flash的完全跨浏览器解决方案。 它适用于FF和Chrome。


#2楼

我的错。 这仅在IE中有效。

这是复制文本的另一种方法:

<p>
    <a onclick="window.clipboardData.setData('text', document.getElementById('Test').innerText);">Copy</a>
</p>

#3楼

ZeroClipboard是我发现的最好的跨浏览器解决方案:

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

如果您需要iOS的非Flash支持,则只需添加一个备用:

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


#4楼

从Flash 10开始,仅当操作源自用户与Flash对象的交互时,才可以将其复制到剪贴板。 ( 阅读Adobe Flash 10公告中的相关部分

解决方案是在“复制”按钮上方放置一个Flash对象,或者使用任何可启动复制的元素。 零剪贴板目前是使用此实现的最佳库。 有经验的Flash开发人员可能只想创建自己的库。


#5楼

我最近写了一篇有关此问题的技术博客文章 (我在Lucidchart工作,最近我们对剪贴板进行了大修)。

假设您要在系统复制事件(用户按下Ctrl C或使用浏览器的菜单)期间执行此操作,将纯文本复制到剪贴板相对简单。

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

不在系统复制事件期间将文本放在剪贴板上要困难得多。 看起来其中一些其他答案引用了通过Flash进行操作的方法,这是唯一的跨浏览器方法(据我所知)。

除此之外,还有基于浏览器的一些选项。

这是IE中最简单的方法,您可以随时通过以下方式从JavaScript访问剪贴板数据对象:

window.clipboardData

(但是,当您尝试在系统剪切,复制或粘贴事件之外执行此操作时,IE会提示用户授予Web应用程序剪贴板权限。)

在Chrome中,您可以创建一个Chrome扩展程序,该扩展程序将为您提供剪贴板权限 (这是我们对Lucidchart所做的工作)。 然后,对于安装了扩展程序的用户,您只需要自己触发系统事件即可:

document.execCommand('copy');

Firefox似乎有一些选项 ,允许用户向某些站点授予访问剪贴板的权限,但是我个人没有尝试过这些选项。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!