2010-12-03 82 views
4

因为我环顾四周,找不到任何好的解决方案,将Firefox或Chrome上的文本复制到剪贴板。不过,我已经尝试过在开发人员网站上提供firefox的一些代码,但仍然无法正常工作,并且在拒绝权限时出现了一个错误。这是我在最后一分钟尝试的代码。复制到Firefox和谷歌浏览器的剪贴板

var copytext = "Text to copy"; 
var str  = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString); 
str.data  = copytext; 

有没有人有一个很好的解决方案来处理这个问题?我希望你的分享。谢谢。

+1

出于安全原因,在这些浏览器中可能会禁用此功能(将剪贴板设置为任意JavaScript字符串)。 – pts 2010-12-03 09:57:21

回答

1

我发现了一个解决方案:

在按下按键的处理程序创建的“预”的标签。设置内容以复制到此标签。在此标记上进行选择并在处理程序中返回true。这个调用铬的标准处理程序并复制选定的文本。

如果你需要你可以设置超时恢复以前的选择功能。我对MooTools的implementantions:

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(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的创建工作,并同。

抱歉,糟糕的英语 - 不是我的母语。

4

我认为它不仅仅是你观看?

如果没有,您可以在Firefox浏览器的about:config中调整设置。在过滤器中查找“signed”,并将单个结果设置为DISABLED。然而,如果你想要整个事情的代码,它是比较好玩的,因为Firefox对此有很好的保护。一个取巧的办法是使用Flash对象传递的字符串,然后使用Flash复制到剪贴板:)

+0

该链接是垃圾邮件 – krisdyson 2013-08-03 19:52:00

+0

@Boomerangertanger感谢您发现,它曾经是一个有效的网站,看起来像是垃圾现在:(我从我的答案中删除它。 – 2013-08-03 22:35:23