2011-10-10 14 views
36

Stavo cercando di fare "Copia negli appunti" funziona su tutti i browser ma senza fortuna.Copia negli appunti per tutti i browser che utilizzano javascript

Sto usando javascript e non voglio usare Zero Clipboard da fare.

Per favore fateci sapere cosa c'è di sbagliato nel mio codice.

Apprezzo il vostro aiuto.

Di seguito si riporta il codice (Attualmente il mio codice funziona solo su browser IE): -

<script type="text/javascript"> 
function copyToClipboard(s) 
{ 
    if(window.clipboardData && clipboardData.setData) 
    { 
     clipboardData.setData("Text", s); 
    } 
    else 
    { 
     // You have to sign the code to enable this or allow the action in about:config by changing 
     user_pref("signed.applets.codebase_principal_support", true); 
     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); 

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

     // create a transferable 
     var trans = Components.classes['@mozilla.org/widget/transferable;[[[[1]]]]'].createInstance(Components.interfaces.nsITransferable); 
     if (!trans) return; 

     // specify the data we wish to handle. Plaintext in this case. 
     trans.addDataFlavor('text/unicode'); 

     // To get the data from the transferable we need two new objects 
     var str = new Object(); 
     var len = new Object(); 

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

     var copytext=meintext; 

     str.data=copytext; 

     trans.setTransferData("text/unicode",str,copytext.length*[[[[2]]]]); 

     var clipid=Components.interfaces.nsIClipboard; 

     if (!clip) return false; 

     clip.setData(trans,null,clipid.kGlobalClipboard);  
    } 
} 
</script> 

<textarea id='testText' rows="10" cols="100">Enter your Sample text</textarea><br /> 
<button onclick="copyToClipboard(document.getElementById('testText').value);" >clipboard</button><br /><br /> 
<textarea rows="10" cols="100">Paste your text here</textarea><br /> 
+0

Duplicato di http://stackoverflow.com/questions/400212/how-to-copy-to-clipboard-in-javascript? –

+4

Come noto, non è possibile utilizzare js per accedere agli appunti in Firefox per impostazione predefinita. L'unico modo universale è flash, invece di js. – Rufus

+0

@Rufus: Ma nel mio caso, devo fare a meno del flash. –

risposta

5

Per motivi di sicurezza la maggior parte dei browser non permettono di modificare gli appunti (ad eccezione di IE, ovviamente ...) .

L'unico modo per rendere compatibile il cross-browser con funzione di copia negli appunti è utilizzare Flash.

+0

Usando l'evento 'copia' è possibile impostare i dati di testo. Se non si utilizzano le funzioni native, selezionare un testo nascosto da copiare. –

10

Questo funziona su Firefox 3.6.x e IE:

function copyToClipboardCrossbrowser(s) {   
     s = document.getElementById(s).value;    

     if(window.clipboardData && clipboardData.setData) 
     { 
      clipboardData.setData("Text", s); 
     }   
     else 
     { 
      // You have to sign the code to enable this or allow the action in about:config by changing 
      //user_pref("signed.applets.codebase_principal_support", true); 
      netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); 

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

      // create a transferable 

      var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable); 
      if (!trans) return; 

      // specify the data we wish to handle. Plaintext in this case. 
      trans.addDataFlavor('text/unicode'); 

      // To get the data from the transferable we need two new objects 
      var str = new Object(); 
      var len = new Object(); 

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

      str.data= s;   

      trans.setTransferData("text/unicode",str, str.data.length * 2); 

      var clipid=Components.interfaces.nsIClipboard;    
      if (!clip) return false; 
      clip.setData(trans,null,clipid.kGlobalClipboard);  
     } 
    } 
+2

Wow! Funziona! Ma invocando cose come "Components.classes ['@ mozilla.org/widget/transferable;1'", stiamo andando al sito di Mozilla? –

+0

Questo non funziona nelle versioni recenti di Firefox, dove 'Components' è deprecato. –

+12

! Abbiamo bisogno di qualcosa di universale per tutti i browser !!! , con i browser ... dove sei? lascerai che io ti picchi su questo ?! – Oneezy

8

ho passato un sacco di tempo alla ricerca di una soluzione a questo problema anche. Ecco cosa ho trovato finora:

Se si desidera che gli utenti siano in grado di fare clic su un pulsante e copiare del testo, potrebbe essere necessario utilizzare Flash.

Se si desidera che gli utenti premano Ctrl + C in qualsiasi punto della pagina, ma copiano sempre xyz negli Appunti, ho scritto una soluzione all-JS in YUI3 (sebbene possa essere facilmente portato su altri framework o JS non formattato se ti senti particolarmente dispiaciuto di me stesso).

Si tratta di creare una casella di testo dallo schermo che viene evidenziata non appena l'utente preme Ctrl/CMD. Quando colpiscono "C" poco dopo, copiano il testo nascosto. Se colpiscono "V", vengono reindirizzati a un contenitore (a tua scelta) prima che l'evento paste venga attivato.

Questo metodo può funzionare bene, perché mentre si ascolta per i tasti Ctrl/CMD keydown qualsiasi parte del corpo, la 'A', 'C' o ascoltatori KeyDown 'V' attaccano solo per la casella di testo nascosto (e non il tutto il corpo). Inoltre, non ha bisogno di rompere le aspettative degli utenti - si viene reindirizzati alla casella nascosta solo se non è stato selezionato nulla da copiare comunque!

Ecco quello che ho a lavorare sul mio sito, ma controllare http://at.cg/js/clipboard.js per gli aggiornamenti se ci sono:

YUI.add('clipboard', function(Y) { 


// Change this to the id of the text area you would like to always paste in to: 

pasteBox = Y.one('#pasteDIV'); 


// Make a hidden textbox somewhere off the page. 

Y.one('body').append('<input id="copyBox" type="text" name="result" style="position:fixed; top:-20%;" onkeyup="pasteBox.focus()">'); 
copyBox = Y.one('#copyBox'); 


// Key bindings for Ctrl+A, Ctrl+C, Ctrl+V, etc: 

// Catch Ctrl/Window/Apple keydown anywhere on the page. 
Y.on('key', function(e) { 
    copyData(); 
     // Uncomment below alert and remove keyCodes after 'down:' to figure out keyCodes for other buttons. 
     // alert(e.keyCode); 
     // }, 'body', 'down:', Y); 
}, 'body', 'down:91,224,17', Y); 

// Catch V - BUT ONLY WHEN PRESSED IN THE copyBox!!! 
Y.on('key', function(e) { 
    // Oh no! The user wants to paste, but their about to paste into the hidden #copyBox!! 
    // Luckily, pastes happen on keyPress (which is why if you hold down the V you get lots of pastes), and we caught the V on keyDown (before keyPress). 
    // Thus, if we're quick, we can redirect the user to the right box and they can unload their paste into the appropriate container. phew. 
    pasteBox.select(); 
}, '#copyBox', 'down:86', Y); 

// Catch A - BUT ONLY WHEN PRESSED IN THE copyBox!!! 
Y.on('key', function(e) { 
    // User wants to select all - but he/she is in the hidden #copyBox! That wont do.. select the pasteBox instead (which is probably where they wanted to be). 
    pasteBox.select(); 
}, '#copyBox', 'down:65', Y); 



// What to do when keybindings are fired: 

// User has pressed Ctrl/Meta, and is probably about to press A,C or V. If they've got nothing selected, or have selected what you want them to copy, redirect to the hidden copyBox! 
function copyData() { 
    var txt = ''; 
    // props to Sabarinathan Arthanari for sharing with the world how to get the selected text on a page, cheers mate! 
     if (window.getSelection) { txt = window.getSelection(); } 
     else if (document.getSelection) { txt = document.getSelection(); } 
     else if (document.selection) { txt = document.selection.createRange().text; } 
     else alert('Something went wrong and I have no idea why - please contact me with your browser type (Firefox, Safari, etc) and what you tried to copy and I will fix this immediately!'); 

    // If the user has nothing selected after pressing Ctrl/Meta, they might want to copy what you want them to copy. 
     if(txt=='') { 
       copyBox.select(); 
     } 
    // They also might have manually selected what you wanted them to copy! How unnecessary! Maybe now is the time to tell them how silly they are..?! 
     else if (txt == copyBox.get('value')) { 
     alert('This site uses advanced copy/paste technology, possibly from the future.\n \nYou do not need to select things manually - just press Ctrl+C! \n \n(Ctrl+V will always paste to the main box too.)'); 
       copyBox.select(); 
     } else { 
       // They also might have selected something completely different! If so, let them. It's only fair. 
     } 
} 
}); 

speranza che qualcun altro trova questo utile:]

+0

E se l'utente usa il mouse per copiare negli appunti? Richiedere il tasto Ctrl/Cmd sembra fragile. – Wolverine

Problemi correlati