2010-12-03 45 views
4

depuis que j'ai regardé autour et ne pouvait pas trouver une bonne solution pour copier du texte sur firefox ou chrome pour le presse-papiers. Cependant, j'ai essayé quelques codes fournis par firefox dans son site de développement, mais toujours pas fonctionné et il y avait un errror avec l'autorisation refusée. Voici le code que j'ai essayé à la dernière minute.Copier dans le presse-papiers sur firefox et google chrome

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

Est-ce que quelqu'un a une bonne solution pour faire face à cela? J'apprécierais pour votre partage. Merci.

+1

Peut-être que cette fonctionnalité (définir le presse-papiers à une chaîne JavaScript arbitraire) a été désactivée dans ces navigateurs pour des raisons de sécurité. – pts

Répondre

1

Je trouve la solution suivante:

Le gestionnaire bas clé créer tag « avant ». Définissez le contenu à copier sur cette étiquette. Effectuez une sélection sur cette balise et renvoyez true dans handler. Cet appel standard gestionnaire de chrome et copié le texte sélectionné.

Et si vous avez besoin, vous pouvez définir un délai pour la fonction de restauration de la sélection précédente. Mes implementantions sur 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(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. :('); 
     }; 
    } 

utilisation:

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; 

Sur sa pâte créer textarea et travailler même.

Désolé pour le mauvais anglais - pas ma langue maternelle.

+0

merci pour votre réponse! – Sinal

4

Je suppose que c'est plus qu'un simple visionnement?

Sinon, vous pouvez ajuster le paramètre dans about: config dans votre navigateur Firefox. Recherchez "signed" dans le filtre et définissez le résultat unique sur DISABLED.

Cependant, si vous voulez du code pour le tout, c'est plus compliqué car Firefox est assez bien protégé contre cela. Une façon délicate est d'utiliser un objet Flash pour passer la chaîne, et puis utiliser Flash pour copier dans le presse-papiers :)

+0

Le lien est spam – krisdyson

+0

@Boomerangertanger Merci d'avoir remarqué que, il était un site Web valide, ressemble à c'est indésirable maintenant :(Je l'ai retiré de ma réponse –