2010-12-03 13 views
4

私は周りを見回し、ファイアウォールやクロムのテキストをクリップボードにコピーするための素晴らしい解決策を見つけることができなかったので、コピーしてください。しかし、私はFirefoxのコードをデベロッパーサイトで提供しようとしましたが、それでも動作しませんでした。許可が拒否されたエラーが1つありました。私が最後に試したコードはここにあります。firefoxとchromeのクリップボードにコピー

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

誰もがこれに対処する良い解決策を持っていますか?私はあなたの分かち合いに感謝します。ありがとう。

+1

セキュリティ上の理由から、これらのブラウザでこの機能(クリップボードを任意のJavaScript文字列に設定)が無効になっている可能性があります。 – pts

答えて

1

次のソリューション私を見つけています:

キーダウンハンドラでは、「プレ」タグを作成します。このタグにコピーするコンテンツを設定します。このタグで選択を行い、ハンドラでtrueを返します。この呼び出しは、chromeの標準ハンドラで、選択されたテキストをコピーしました。

また、以前の選択を復元するための関数にタイムアウトを設定することができます。 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; 

そのテキストエリアを作成し、同じ仕事。

ご迷惑をかけて申し訳ありませんが、私の母国語は英語です。

+0

あなたの答えに感謝! – Sinal

4

私はそれを見ているだけではありません。

Firefoxブラウザでabout:configの設定を調整することができます。フィルタで「署名済み」を探し、単一の結果をDISABLEDに設定します。

しかし、コード全体が必要な場合は、Firefoxがそれに対してかなり安全であるので、それは厄介です。一つのトリッキーな方法は、に文字列を渡すためにFlashオブジェクトを使用して、クリップボードにコピーするには、Flashを使用することです:)

+0

リンクは迷惑メールです – krisdyson

+0

@Boomerangertangerは、有効なウェブサイトであることを確認してくれてありがとうございます。今は迷惑メールに見えます。(私はそれを私の回答から削除した。 –

関連する問題