2010-12-03 88 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

相關問題