Skopiuj do schowka bez Flasha

90

Znalazłem wiele rozwiązań do kopiowania do schowka, ale wszystkie one albo z fleszem, albo dla stron internetowych. Szukam metody kopiowania do schowka automatycznie, bez flasha i po stronie użytkownika, to jest dla skryptów użytkownika i oczywiście dla wielu przeglądarek.

Czarne słońce
źródło
Nie znalazłem żadnego, szukałem tego samego. Czy chciałem użyć Flasha, albo usunąłem tę funkcję przed utworzeniem.
EugeneK
1
Wątpię, czy można to zrobić bez użycia FLASH w różnych przeglądarkach. Ale są dostępne konkretne rozwiązania, które mogą pomóc ci uzyskać rozwiązanie zeroclipboard
Rakesh Sankar
Rakesh - Twoje „konkretne rozwiązanie” bazuje na Flashu. Nie będzie działać w żadnej przeglądarce, której używam.
RobG
1
Metoda @wizztjh w stackoverflow.com/questions/400212/… jest po stronie witryny, a nie po stronie użytkownika @Rakesh zeroclipboard jest dobry, ale chcę znaleźć metodę całkowicie bez Flasha
Black_Sun

Odpowiedzi:

31

Bez Flasha jest to po prostu niemożliwe w większości przeglądarek. Schowek użytkownika jest zasobem istotnym dla bezpieczeństwa, ponieważ może zawierać takie elementy, jak hasła lub numery kart kredytowych. Dlatego przeglądarki słusznie nie zezwalają na dostęp do niego w Javascript (niektóre pozwalają na to z ostrzeżeniem pokazanym, że użytkownik potwierdził, lub z podpisanym kodem Javascript, ale żadna z nich nie jest cross-browser).

Michael Borgwardt
źródło
21
Może więc strony nie powinny móc czytać ze schowka, ale dlaczego nie pisać do niego? = /
Ajedi32,
5
Ale w takim razie po co pozwalać na to przez ukrytą flash, która nie wymaga powiadomienia użytkownika ani opinii?
Eric Grange
3
@EricGrange: Ponieważ w połowie lat 90. ktoś w Netscape zdecydował, że ze względu na wydajność wtyczki do przeglądarek będą natywnymi plikami binarnymi, dzięki czemu będą w stanie zrobić prawie wszystko. Świat online był wtedy bardzo prostym miejscem, a bezpieczeństwo nie stanowiło większego problemu.
Michael Borgwardt
4
Chociaż ta odpowiedź była prawdziwa w 2011 roku, przeglądarki przeszły długą drogę w walce o zabicie Flasha. Zobacz moją odpowiedź poniżej.
Hovis Biddle
25

Wypróbowałem rozwiązanie flashowe i też mi się nie podobało. Zbyt złożone i zbyt wolne. Stworzyłem obszar tekstowy, umieściłem w nim dane i użyłem zachowania przeglądarki „CTRL + C”.

Część javascript jQuery:

// catch the "ctrl" combination keydown
$.ctrl = function(key, callback, args) {
    $(document).keydown(function(e) {
        if(!args) args=[]; // IE barks when args is null
        if(e.keyCode == key && e.ctrlKey) {
            callback.apply(this, args);
            return false;
        }
    });
};

// put your data on the textarea and select all
var performCopy = function() {
    var textArea = $("#textArea1");
    textArea.text('PUT THE TEXT TO COPY HERE. CAN BE A FUNCTION.');
    textArea[0].focus();
    textArea[0].select();
};

// bind CTRL + C
$.ctrl('C'.charCodeAt(0), performCopy);

Część HTML:
<textarea id="textArea1"></textarea>

Teraz umieść to, co chcesz skopiować, w „WPISZ TEKST DO SKOPIOWANIA TUTAJ. MOŻE BYĆ FUNKCJĄ. powierzchnia. U mnie działa dobrze. Musisz tylko wykonać jedną kombinację CTRL + C. Jedyną wadą jest to, że w witrynie będzie wyświetlany brzydki obszar tekstowy. Jeśli użyjesz style = "display: none", rozwiązanie kopiowania nie będzie działać.

Julio Saito
źródło
6
Wydaje się, że wiąże to tylko funkcję Ctrl + C z funkcją javascript i nie umieszcza danych w schowku systemu operacyjnego.
Ishmael
jasne, to jest idea. Utwórz kopię przeglądarki dla siebie. Podobne rozwiązanie jest tutaj: knockoutjs.com/examples/clickCounter.html . Po dwukrotnym kliknięciu tworzą one obszar tekstowy za pomocą javascript z zawartością.
Julio Saito,
nie działa dla mnie na osx, więc dodałem e.metaKeyw porównaniu z keydown, ale z jakiegoś powodu akcja kopiowania nie jest uruchamiana. Zobacz to skrzypce: jsfiddle.net/gableroux/gta67/1
GabLeRoux
2
@GabLeRoux funkcja kopiowania w safari jest włączona tylko wtedy, gdy zaznaczony jest tekst. To działało wcześniej, ale aktualizacja Safari niedawno go zatrzymała. Wydaje się, że zaznaczenie tekstu po wywołaniu zdarzenia naciśnięcia klawisza po prostu nie powoduje już jego usunięcia w tej przeglądarce. Jednak nadal działa dobrze w chromie. No cóż, może trzeba będzie wrócić do używania Flasha tylko dla tej przeglądarki ...
Aran Mulholland,
Lubię to. Kiedy nie możesz ukryć (z jakiegokolwiek powodu) elementu, którego nie musisz widzieć, zawsze możesz odłożyć go daleko od początku, na przykład padding-bottom: -1000.
m3nda
3

Podczas gdy z niecierpliwością czeka na Xbrowser wsparciu API Schowek ...


Będzie to pięknie działać w Chrome, Firefox, Edge, IE

IE tylko raz poprosi użytkownika o dostęp do Schowka.
Safari (5.1 w momencie pisania) nie obsługuje execCommanddlacopy/cut

/**
 * CLIPBOARD
 * https://stackoverflow.com/a/33337109/383904
 */
const clip = e => {
  e.preventDefault();
  
  const cont = e.target.innerHTML;
  const area = document.createElement("textarea");
  
  area.value = e.target.innerHTML; // or use .textContent
  document.body.appendChild(area);
  area.select();
 
  if(document.execCommand('copy')) console.log("Copied to clipboard");
  else prompt("Copy to clipboard:\nSelect, Cmd+C, Enter", cont); // Saf, Other
  
  area.remove();
};


[...document.querySelectorAll(".clip")].forEach(el => 
  el.addEventListener("click", clip)
);
<a class="clip" href="#!">Click an item to copy</a><br>
<a class="clip" href="#!"><i>Lorem</i></a><br>
<a class="clip" href="#!"><b>IPSUM</b></a><br>

<textarea placeholder="Paste here to test"></textarea>

Wszystkie (z wyjątkiem przeglądarek Firefox, który jest w stanie obsłużyć tylko typ MIME "plain/text"miarę Przetestowałem) zostały nie zrealizowane z API schowka . To znaczy, próbując odczytać zdarzenie schowka w Chrome przy użyciu

var clipboardEvent = new ClipboardEvent("copy", {
        dataType: "plain/text",
        data: "Text to be sent to clipboard"
});

throws: Uncaught TypeError: Illegal constructor

Najlepsze źródło niewiarygodnego bałaganu, który dzieje się między przeglądarkami i schowkiem, można zobaczyć tutaj (caniuse.com) (→ Śledź komentarze w sekcji „Uwagi” ).
MDN mówi, że podstawową obsługą jest „(TAK)” dla wszystkich przeglądarek, co jest niedokładne, ponieważ można by oczekiwać, że przynajmniej API będzie w ogóle działać.

Roko C. Buljan
źródło
1

Możesz użyć schowka lokalnego dla strony HTML. Umożliwia to kopiowanie / wycinanie / wklejanie treści W RAMACH strony HTML, ale nie z / do aplikacji innych firm lub między dwiema stronami HTML.

Oto jak możesz napisać niestandardową funkcję, która to zrobi (przetestowana w Chrome i Firefox):

Oto FIDDLE, które pokazuje, jak możesz to zrobić.

Wkleję tutaj również skrzypce w celach informacyjnych.


HTML

<p id="textToCopy">This is the text to be copied</p>
<input id="inputNode" type="text" placeholder="Copied text will be pasted here" /> <br/>

<a href="#" onclick="cb.copy()">copy</a>
<a href="#" onclick="cb.cut()">cut</a>
<a href="#" onclick="cb.paste()">paste</a>

JS

function Clipboard() {
    /* Here we're hardcoding the range of the copy
    and paste. Change to achieve desire behavior. You can
    get the range for a user selection using
    window.getSelection or document.selection on Opera*/
    this.oRange = document.createRange();
    var textNode = document.getElementById("textToCopy");
    var inputNode = document.getElementById("inputNode");
    this.oRange.setStart(textNode,0);
    this.oRange.setEndAfter(textNode);
    /* --------------------------------- */
}

Clipboard.prototype.copy = function() {
    this.oFragment= this.oRange.cloneContents();
};

Clipboard.prototype.cut = function() {
    this.oFragment = this.oRange.extractContents();
};

Clipboard.prototype.paste = function() {
    var cloneFragment=this.oFragment.cloneNode(true)
    inputNode.value = cloneFragment.textContent;
};

window.cb = new Clipboard();
mrBorna
źródło
Hej mtBrona. Czy jest sposób, aby dołączyć jakieś jsfiddle do tego? Wydaje się, że nie można go aktywować
neoswf
Czy możemy podać tutaj ciąg zamiast elementu
Uday A. Navapara
To działa tylko wtedy, gdy jesteś wewnątrz tego samego window. To nie jest rzeczywisty schowek dostępny dla systemu operacyjnego i innej karty przeglądarki. Również selekcji można łatwo dokonać za pomocą select()i niż po prostuwindow.getSelection()
Roko C. Buljan
0

document.execCommand('copy')zrobisz, co chcesz. Ale w tym wątku nie było przykładów bezpośrednio użytecznych bez cruft, więc oto jest:

var textNode = document.querySelector('p').firstChild
var range = document.createRange()
var sel = window.getSelection()

range.setStart(textNode, 0)
range.setEndAfter(textNode)
sel.removeAllRanges()
sel.addRange(range)
document.execCommand('copy')
odinho - Velmont
źródło
-2

Nie da się obejść, musisz użyć lampy błyskowej. Istnieje wtyczka JQuery o nazwie jquery.copy, która umożliwia kopiowanie i wklejanie w różnych przeglądarkach za pomocą pliku flash (swf). Jest to podobne do działania wyróżniacza składni na moim blogu.

Po odwołaniu się do pliku jquery.copy.js wszystko, co musisz zrobić, aby wypchnąć dane do schowka, to:

$.copy("some text to copy");

Miło i łatwo;)

Talha Ahmed Khan
źródło
Link uszkodzony (pliki nie są już dostępne do pobrania)
SeinopSys