2011-10-10 21 views
36

Próbowałem zrobić "Kopiuj do schowka" działa we wszystkich przeglądarkach, ale bez powodzenia.Skopiuj do schowka dla wszystkich przeglądarek korzystających z javascript

Używam javascript i nie chcę używać do tego celu Zero Clipboard.

Daj nam znać, co złego w moim kodzie.

Doceniamy Twoją pomoc.

Poniżej znajduje się kod (Obecnie mój kod działa tylko na 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

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

+4

Jak wiem, nie można używać js domyślnie do uzyskiwania dostępu do schowka w Firefoksie. Jedynym uniwersalnym sposobem jest flash, zamiast js. – Rufus

+0

@Rufus: Ale w moim przypadku, muszę zrobić bez flasha. –

Odpowiedz

5

Ze względów bezpieczeństwa większość przeglądarek nie pozwalają na modyfikowanie schowka (z wyjątkiem IE, oczywiście ...) .

Jedynym sposobem na dostosowanie funkcji kopiowania do schowka w różnych przeglądarkach jest użycie Flasha.

+0

Używając zdarzenia 'copy' można ustawić dane tekstowe. Jeśli nie korzystasz z funkcji natywnych, to zaznaczając ukryty tekst do skopiowania. –

10

To działa na Firefox 3.6.x oraz 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! To działa! Ale wywołując rzeczy takie jak "Components.classes [" @ mozilla.org/widget/transferable;1 '] ", czy idziemy na stronę Mozilli? –

+0

To nie działa w najnowszych wersjach Firefoksa, w których 'Components' jest nieaktualne. –

+12

! Potrzebujemy czegoś uniwersalnego dla wszystkich przeglądarek !!! , com'on przeglądarek ... gdzie jesteś. pozwolisz IE pobić was w tej sprawie ?! – Oneezy

8

spędziłem dużo czasu patrząc na rozwiązanie tego problemu zbyt. Oto, co znalazłem do tej pory:

Jeśli chcesz, aby użytkownicy mogli kliknąć przycisk i skopiować tekst, być może trzeba użyć Flasha.

Jeśli chcesz, aby użytkownicy wciskali Ctrl + C w dowolnym miejscu na stronie, ale zawsze kopiuj xyz do schowka, napisałem rozwiązanie JS w YUI3 (chociaż można je łatwo przenieść do innych frameworków lub surowego JS jeśli czujesz się szczególnie wstrętny).

Wymaga to utworzenia pola tekstowego poza ekranem, który zostanie podświetlony, gdy tylko użytkownik kliknie Ctrl/CMD. Kiedy trafią "C" krótko po, kopiują ukryty tekst. Jeśli trafią "V", zostaną przekierowani do wybranego kontenera przed wywołaniem zdarzenia wklejania.

Ta metoda może działać dobrze, ponieważ podczas słuchania Ctrl/CMD keydown gdziekolwiek w ciele, słuchacze keydown "A", "C" lub "V" dołączają tylko do ukrytego pola tekstowego (a nie do Całe ciało). Nie musi też przekraczać oczekiwań użytkowników - przekierowywany jest tylko do ukrytego pudełka, jeśli i tak nie wybrałbyś żadnej opcji kopiowania!

Oto co mam działa na moim miejscu, ale sprawdź http://at.cg/js/clipboard.js aktualizacje jeśli istnieją:

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. 
     } 
} 
}); 

nadzieję, że ktoś inny uzna to za przydatne:]

+0

Co zrobić, jeśli użytkownik używa myszy do skopiowania do schowka? Wymaganie klawisza Ctrl/Cmd wydaje się kruche. – Wolverine

Powiązane problemy