在Firefox中使用Javascript复制到剪贴板

时间:2014-02-11 07:51:59

标签: javascript firefox clipboard

我真的需要一种方法将一些文本复制到Firefox中的操作系统剪贴板。

知道在IE中很容易,除非使用闪存,否则在Chrome和Opera中无法实现。由于不同的原因,我无法使用闪存解决方案!

如果它在过去工作但现在netscape.security.PrivilegeManager.enablePrivilege受到保护,据我所知(从第17节开始)。

根据这篇文章,它看起来仍然可能:

https://developer.mozilla.org/en-US/docs/Using_the_Clipboard

相信仍然需要在user.js文件中启用此功能

user_pref("capability.policy.policynames", "allowclipboard");
user_pref("capability.policy.allowclipboard.sites", "http://");
user_pref("capability.policy.allowclipboard.Clipboard.cutcopy", "allAccess"); 

但是我该怎么办呢?已经做了一些测试而没有取得很大成功,并且认为网上没有指南可以解释如何以通用方式完成。例如。关于如何启用javascript访问剪贴板的简单指南。希望也是新手用户可以使用的指南。喜欢这样做并在此发布,但首先需要一个有效的解决方案。

根据网络,有2个复制到剪贴板的解决方案;

document.execCommand("copy", false, null) 

var gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
  gClipboardHelper.copyString("Put me on the clipboard, please.");

第一次尝试都会导致失败。

下面的解决方案需要用户按CTRL + C,我需要一个解决方案,文本将根据按下按钮复制(单页上很多)。

https://stackoverflow.com/questions/4344325/copy-to-clipboard-on-firefox-and-google-chrome/11346026#11346026

我的旧解决方案是这样的:

var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);

if(clip)
{
  var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);

  if(trans)
  {
    var str = new Object();
    var len = new Object();
    var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);

    if(str)
    {
      var clipid=Components.interfaces.nsIClipboard;

      if(clipid)
      {                 
        str.data = cliptext;

        trans.addDataFlavor('text/unicode');                    
        trans.setTransferData("text/unicode", str, cliptext.length*2);      

        clip.setData(trans, null, clipid.kGlobalClipboard); // No return value
        return 0;
      }
    }
  }
}

在非特权代码(不是附加组件等)中未定义Components.classes,所以我不相信任何解决方案都可以使用。一个选项是创建一个将在特权代码区域中执行的加载项,并将要复制的文本发送到此附加组件,以便将副本处理到操作系统剪贴板(这是一个很好的新项目)。

这只会将document.execCommand(“copy”,false,null)作为独立解决方案留在字段中。

尝试使用此代码并且不会将任何内容复制到操作系统剪贴板 - 但不会产生任何错误btw。

var pre = document.getElementById('pcryptcopytext');

if(!pre)
{
  pre = document.createElement("pre");
  pre.setAttribute('id', 'pcryptcopytext');
  pre.setAttribute('style', 'opacity: 0; position: absolute; top: -10000px; right: 0;');
  document.body.appendChild(pre);
}

pre.innerHTML = cliptext;
pre.contentEditable = true;
//pre.unselectable = "off";
//pre.focus();

if (document.createRange) 
{
  var rng = document.createRange();
  rng.selectNodeContents(pre);
  document.execCommand("copy", false, null);
  document.body.removeChild(pre);
}

那么,有人找到了解决方案吗?

3 个答案:

答案 0 :(得分:6)

看起来这种情况不再受支持,而且没有替代品:(

https://support.mozilla.org/en-US/questions/977068#answer-500083

在Firefox错误中制作一些噪音可能会帮助我们获得(安全)解决方案。

答案 1 :(得分:3)

通过创建公开剪贴板对象的Firefox加载项来解决:https://github.com/myplaceonline/myplaceonline_ffclipboard

示例:

if (window.ffclipboard) {
  window.ffclipboard.setText("clipboard text");
}

答案 2 :(得分:0)

你只需要向 Firefox 提供你的数据并告诉它你想用它做什么

navigator.clipboard.writeText("text you want to copy").then(() => {
    // on success
}, (e) => {
    // on error
});
document.execCommand("copy");