Jaki jest najlepszy sposób na skopiowanie tekstu do schowka? (wiele przeglądarek)
Próbowałem:
function copyToClipboard(text) {
if (window.clipboardData) { // Internet Explorer
window.clipboardData.setData("Text", text);
} else {
unsafeWindow.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
const clipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
clipboardHelper.copyString(text);
}
}
ale w Internet Explorerze daje błąd składniowy. W Firefoksie jest napisane unsafeWindow is not defined
.
Fajna sztuczka bez flasha: w jaki sposób Trello uzyskuje dostęp do schowka użytkownika?
javascript
clipboard
copy-paste
Santiago Corredoira
źródło
źródło
Odpowiedzi:
Przegląd
Istnieją trzy podstawowe interfejsy API przeglądarki do kopiowania do schowka:
[navigator.clipboard.writeText]
document.execCommand('copy')
Ogólne uwagi dotyczące rozwoju
Nie oczekuj, że polecenia związane ze schowkiem będą działać podczas testowania kodu w konsoli. Zasadniczo strona musi być aktywna (Async Clipboard API) lub wymaga interakcji użytkownika (np. Kliknięcia użytkownika), aby umożliwić (
document.execCommand('copy')
) dostęp do schowka, patrz poniżej, aby uzyskać więcej szczegółów.WAŻNE (odnotowano tutaj 2020/02/20)
Zauważ, że ponieważ ten post został pierwotnie napisany, wycofanie uprawnień w IFRAME pochodzących z różnych źródeł i innych „piaskownicach” IFRAME uniemożliwia osadzonym demonstracjom przyciski „Uruchom fragment kodu” oraz „przykładowy kodepen.io” w niektórych przeglądarkach (w tym Chrome i Microsoft Edge ).
Aby opracować, stwórz własną stronę internetową, wyświetl tę stronę przez połączenie HTTPS, aby przetestować i rozwinąć.
Oto strona testowa / demonstracyjna, która demonstruje działanie kodu: https://deanmarktaylor.github.io/clipboard-test/
Async + Fallback
Z powodu poziomu obsługi przeglądarki dla nowego API Async Clipboard prawdopodobnie będziesz chciał wrócić do tej
document.execCommand('copy')
metody, aby uzyskać dobry zasięg przeglądarki.Oto prosty przykład (może nie działać osadzony w tej witrynie, przeczytaj „ważną” uwagę powyżej):
(przykład codepen.io może nie działać, przeczytaj „ważną” uwagę powyżej). Uwaga: ten fragment kodu nie działa dobrze we wbudowanym podglądzie przepełnienia stosu, możesz go wypróbować tutaj: https://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011
Asynchroniczny interfejs API schowka
Pamiętaj, że istnieje możliwość „żądania uprawnień” i testowania dostępu do schowka za pośrednictwem interfejsu API uprawnień w Chrome 66.
document.execCommand („kopia”)
Pozostała część tego postu dotyczy niuansów i szczegółów
document.execCommand('copy')
API.Obsługa przeglądarki
Obsługa JavaScript
document.execCommand('copy')
wzrosła, zobacz poniższe linki do aktualizacji przeglądarki:Prosty przykład
(może nie działać w tej witrynie, przeczytaj „ważną” uwagę powyżej)
Skomplikowany przykład: skopiuj do schowka bez wyświetlania danych wejściowych
Powyższy prosty przykład działa świetnie, jeśli na ekranie widoczny jest element
textarea
lubinput
.W niektórych przypadkach możesz chcieć skopiować tekst do schowka bez wyświetlania elementu
input
/textarea
. To jest jeden przykład sposobu obejścia tego (w zasadzie wstaw element, skopiuj do schowka, usuń element):Testowane z Google Chrome 44, Firefox 42.0a1 i Internet Explorer 11.0.8600.17814.
(może nie działać w tej witrynie, przeczytaj „ważną” uwagę powyżej)
Dodatkowe uwagi
Działa tylko wtedy, gdy użytkownik podejmie akcję
Wszystkie
document.execCommand('copy')
połączenia muszą odbywać się bezpośrednio w wyniku działania użytkownika, np. Obsługi zdarzenia kliknięcia. Jest to środek zapobiegający bałaganowi w schowku użytkownika, gdy się tego nie spodziewa.Aby uzyskać więcej informacji, zobacz post Google Developers tutaj .
Interfejs API schowka
Uwaga: pełna specyfikacja wersji roboczej API Clipboard można znaleźć tutaj: https://w3c.github.io/clipboard-apis/
Czy to jest obsługiwane?
document.queryCommandSupported('copy')
powinien zwrócić,true
jeśli polecenie „jest obsługiwane przez przeglądarkę”.document.queryCommandEnabled('copy')
wróć,true
jeślidocument.execCommand('copy')
odniesie sukces, jeśli zostanie teraz wezwany Sprawdzanie, czy polecenie zostało wywołane z wątku inicjowanego przez użytkownika i czy spełnione są inne wymagania.Jednak jako przykład problemów z kompatybilnością przeglądarka Google Chrome ~ od kwietnia do października 2015 r ~ tylko powracających
true
zdocument.queryCommandSupported('copy')
jeżeli zostało wywołane z wątku inicjowane przez użytkownika.Zwróć uwagę na szczegóły dotyczące kompatybilności poniżej.
Szczegółowa kompatybilność przeglądarki
Podczas gdy proste wywołanie
document.execCommand('copy')
owinięte w bloktry
/catch
wywoływany w wyniku kliknięcia przez użytkownika zapewni największą kompatybilność, poniższe mają pewne zastrzeżenia:Wszelkie wywołanie
document.execCommand
,document.queryCommandSupported
lubdocument.queryCommandEnabled
powinny być zapakowane wtry
/catch
bloku.Różne implementacje przeglądarki i wersje przeglądarki generują różne typy wyjątków, gdy są wywoływane zamiast zwracane
false
.Różne implementacje przeglądarki wciąż się zmieniają, a Clipboard API jest nadal w fazie roboczej, więc pamiętaj, aby wykonać test.
źródło
var str = "word";
?<textarea>
pomocą JS, dołącz godocument.body
, ustaw jego wartość na zmienną i użyj jej w tempiecopyTextarea
, a następnie usuń ją zaraz po skopiowaniu zawartości.Automatyczne kopiowanie do schowka może być niebezpieczne, dlatego większość przeglądarek (oprócz IE) bardzo utrudnia. Osobiście używam następującej prostej sztuczki:
Użytkownik zostanie wyświetlony z monitem, w którym tekst do skopiowania jest już zaznaczony. Teraz wystarczy nacisnąć Ctrl+ Ci Enter(aby zamknąć okno) - i voila!
Teraz operacja kopiowania do schowka jest BEZPIECZNA, ponieważ użytkownik robi to ręcznie (ale w całkiem prosty sposób). Oczywiście działa we wszystkich przeglądarkach.
źródło
Poniższe podejście działa w Chrome, Firefox, Internet Explorer i Edge oraz w najnowszych wersjach Safari (obsługa kopiowania została dodana w wersji 10, która została wydana w październiku 2016 r.).
Uwaga: obszar tekstowy nie będzie widoczny, ponieważ jest on dodawany i usuwany w ramach tego samego synchronicznego wywołania kodu JavaScript.
Kilka rzeczy, na które należy uważać, jeśli wdrażasz to sam:
Poniższa funkcja powinna obsłużyć wszystkie poniższe problemy tak czysto, jak to możliwe. Zostaw komentarz, jeśli znajdziesz jakieś problemy lub masz sugestie dotyczące jego poprawy.
https://jsfiddle.net/fx6a6n6x/
źródło
Oto moje zdanie na temat tego ...
@korayem: Zauważ, że użycie
input
pola html nie będzie respektować podziałów linii\n
i spłaszczy tekst w jednym wierszu.Jak wspomniano w komentarzach @nikksan, użycie
textarea
rozwiąże problem w następujący sposób:źródło
\n
?\r\n
do podziału wierszaJeśli chcesz naprawdę prostego rozwiązania (integracja zajmuje mniej niż 5 minut) i wygląda dobrze od razu po wyjęciu z pudełka, to Clippy to miła alternatywa dla niektórych bardziej złożonych rozwiązań.
Został napisany przez współzałożyciela GitHub. Przykładowy kod Flash poniżej:
Pamiętaj, aby zastąpić
#{text}
tekstem, który chcesz skopiować, i#{bgcolor}
kolorem.źródło
Czytanie i modyfikowanie schowka ze strony budzi obawy dotyczące bezpieczeństwa i prywatności. Jednak w Internet Explorerze można to zrobić. Znalazłem ten przykładowy fragment :
źródło
execCommand(\\’copy\\’);
, jeśli nie skopiować do schowka dla IE? @mrBornaif(!document.all)
, aleif(!r.execCommand)
żeby ktokolwiek Realizuje! Document.all absolutnie nie ma związku z tym.Niedawno napisałem techniczny post na blogu na ten temat (pracuję w Lucidchart, a ostatnio dokonaliśmy przeglądu naszego schowka).
Kopiowanie zwykłego tekstu do schowka jest stosunkowo proste, zakładając, że chcesz to zrobić podczas zdarzenia kopiowania systemowego (użytkownik naciska CtrlClub korzysta z menu przeglądarki).
Umieszczanie tekstu w schowku poza zdarzeniem kopiowania systemowego jest znacznie trudniejsze. Wygląda na to, że niektóre z tych odpowiedzi odnoszą się do tego, jak to zrobić za pomocą Flasha, który jest jedynym sposobem na przeglądarkę (o ile rozumiem).
Poza tym istnieją pewne opcje dla poszczególnych przeglądarek.
Jest to najprostszy w IE, w którym można uzyskać dostęp do obiektu clipboardData w dowolnym momencie z JavaScript poprzez:
(Gdy jednak spróbujesz to zrobić poza zdarzeniem wycinania, kopiowania lub wklejania w systemie, IE wyświetli monit o przyznanie pozwolenia na schowek aplikacji sieci Web).
W Chrome możesz utworzyć rozszerzenie Chrome, które da ci uprawnienia do schowka (to właśnie robimy dla Lucidchart). Następnie dla użytkowników z zainstalowanym rozszerzeniem wystarczy samemu uruchomić zdarzenie systemowe:
Wygląda na to, że Firefox ma pewne opcje, które pozwalają użytkownikom na przyznawanie uprawnień do niektórych witryn w celu uzyskania dostępu do schowka, ale nie próbowałem żadnej z nich osobiście.
źródło
clipboard.js to małe narzędzie inne niż Flash, które umożliwia kopiowanie danych tekstowych lub HTML do schowka. Jest bardzo łatwy w użyciu, wystarczy dołączyć .js i użyć czegoś takiego:
clipboard.js jest również dostępny na GitHub .
źródło
ZeroClipboard to najlepsze rozwiązanie dla różnych przeglądarek, jakie znalazłem:
Jeśli potrzebujesz obsługi non-flash dla iOS, po prostu dodaj rezerwę:
http://zeroclipboard.org/
https://github.com/zeroclipboard/ZeroClipboard
źródło
src
znaczników w skrypcie). Uważam, że ich dokumentacja jest ładna, ale nieefektywna.W 2018 r. Możesz to zrobić w następujący sposób:
Jest używany w moim kodzie Angular 6+ w taki sposób:
Jeśli przekażę ciąg, kopiuje go. Jeśli nic, kopiuje adres URL strony.
Można również zrobić więcej gimnastyki do schowka. Zobacz więcej informacji tutaj:
Odblokowanie dostępu do schowka
źródło
Z jednego z projektów, nad którymi pracowałem, wtyczka jQuery kopiująca do schowka, która wykorzystuje bibliotekę Zero Clipboard .
Jest łatwiejszy w użyciu niż natywna wtyczka Zero Clipboard, jeśli jesteś intensywnym użytkownikiem jQuery.
źródło
text()
zamiast tego,innerHTML()
jeśli chcesz ...innerHTML
od dłuższego czasu jest obsługiwany w różnych przeglądarkach. Tylko dlatego, że Microsoft początkowo wpadł na ten pomysł, nie czyni go zawodnym ani zastrzeżonym. Jest także w końcu dodawany do oficjalnej specyfikacji (po tym, jak każdy większy sprzedawca przeglądarki dodał już obsługę tego ... westchnienie ).92KB
jest naprawdę duży. Dopóki LTE nie dojrzeje GPRS jest standardem danych mobilnych WW i zaczyna się od1 KB/s
. Zrób matematykę sam.Ponieważ przeglądarki Chrome 42+ i Firefox 41+ obsługują teraz polecenie document.execCommand ('copy') . Więc stworzyliśmy kilka funkcji dla cross-browser możliwość kopiowania do schowka, używając kombinacji starego odpowiedzi Tim Downa i odpowiedzi Google programisty :
źródło
Używam tego bardzo skutecznie ( bez jQuery lub innych ram).
Ostrzeżenie
Tabulatory są konwertowane na spacje (przynajmniej w Chrome).
źródło
Znalazłem następujące rozwiązanie:
Po naciśnięciu klawisza moduł obsługi tworzy znacznik „pre”. Ustawiamy zawartość do skopiowania do tego znacznika, następnie dokonujemy wyboru na tym znaczniku i zwracamy true w module obsługi. To wywołuje standardowy moduł obsługi chrome i kopiuje zaznaczony tekst.
W razie potrzeby możesz ustawić limit czasu dla funkcji przywracania poprzedniego wyboru. Moja implementacja w Mootools:
Stosowanie:
Po wklejeniu tworzy obszar tekstowy i działa w ten sam sposób.
PS. Być może to rozwiązanie może być użyte do stworzenia w pełni przeglądarki dla wielu przeglądarek bez flashowania. Działa w FF i Chrome.
źródło
Inne metody skopiują zwykły tekst do schowka. Aby skopiować HTML (tzn. Możesz wkleić wyniki do edytora WSIWYG), możesz wykonać następujące czynności TYLKO w IE . Jest to zasadniczo odmienne od innych metod, ponieważ przeglądarka faktycznie widocznie wybiera treść.
źródło
Zebrałem razem to, co uważam za najlepsze.
Oto on:
Stosowanie:
copyToClipboard('some text')
źródło
Począwszy od Flash 10, możesz kopiować do schowka tylko wtedy, gdy akcja pochodzi z interakcji użytkownika z obiektem Flash. ( Przeczytaj sekcję pokrewną z ogłoszenia Adobe Flash 10 )
Rozwiązaniem jest przesadny obiekt flash nad przyciskiem Kopiuj lub dowolny element inicjujący kopiowanie. Zero Clipboard jest obecnie najlepszą biblioteką z tą implementacją. Doświadczeni programiści Flash mogą po prostu chcieć stworzyć własną bibliotekę.
źródło
źródło
Znalazłem następujące rozwiązanie:
Mam tekst w ukrytym wejściu. Ponieważ
setSelectionRange
nie działa na ukrytych danych wejściowych, tymczasowo zmieniłem typ na tekst, skopiowałem tekst, a następnie ponownie go ukryłem. Jeśli chcesz skopiować tekst z elementu, możesz przekazać go do funkcji i zapisać jego zawartość w zmiennej docelowej.źródło
Skopiuj tekst z danych wejściowych HTML do schowka:
Uwaga: Ta
document.execCommand()
metoda nie jest obsługiwana w przeglądarce Internet Explorer 9 i wcześniejszych.Źródło : W3Schools - Skopiuj tekst do schowka
źródło
Istnieje już wiele odpowiedzi, ale jak dodać jedną (jQuery). Działa świetnie w każdej przeglądarce, także mobilnej (tzn. Wyświetla monit o bezpieczeństwo, ale po zaakceptowaniu działa po prostu dobrze).
W twoim kodzie:
źródło
To jest trochę połączenie innych odpowiedzi.
Korzysta z jQuery, ale oczywiście nie musi. Możesz to zmienić, jeśli chcesz. Właśnie miałem do dyspozycji jQuery. Możesz również dodać trochę CSS, aby upewnić się, że dane wejściowe się nie wyświetlają. Na przykład coś takiego:
Lub oczywiście możesz wykonać stylizację wbudowaną
źródło
textToCopy
zawierał\n
W przeglądarkach innych niż IE musisz używać małego obiektu flash do manipulowania schowkiem, np
źródło
Miałem ten sam problem z budowaniem niestandardowej edycji siatki z (coś takiego jak Excel) i kompatybilnością z Excelem. Musiałem wspierać wybieranie wielu komórek, kopiowanie i wklejanie.
Rozwiązanie: utwórz obszar tekstowy, w którym wstawisz dane do skopiowania przez użytkownika (dla mnie, gdy użytkownik wybiera komórki), ustaw fokus na nim (na przykład po naciśnięciu przez użytkownika Ctrl) i zaznacz cały tekst.
Tak więc, gdy użytkownik naciśnie Ctrl+C on / ona pobiera skopiowane komórki, on / ona wybiera. Po przetestowaniu zmieniłem rozmiar obszaru tekstowego na jeden piksel (nie sprawdziłem, czy będzie działał na wyświetlaczu: brak). Działa ładnie na wszystkich przeglądarkach i jest przezroczysty dla użytkownika.
Wklejanie - możesz zrobić tak samo (w zależności od celu) - skup się na obszarze tekstowym i przechwytuj zdarzenia wklejania za pomocą onpaste (w moim projekcie do edycji używam obszarów tekstowych w komórkach).
Nie mogę wkleić przykładu (projekt komercyjny), ale masz pomysł.
źródło
Użyłem clipboard.js.
Możemy go zdobyć na npm:
A także na Bower
Sposób użycia i przykłady są na https://zenorocha.github.io/clipboard.js/ .
źródło
Jest to rozszerzenie odpowiedzi @ Chase, z tą zaletą, że będzie działać dla elementów OBRAZ i TABELA, nie tylko DIV na IE9.
źródło
Wygląda na to, że źle odczytałem pytanie, ale w celach informacyjnych możesz wyodrębnić zakres DOM (nie do schowka; zgodny ze wszystkimi nowoczesnymi przeglądarkami) i połączyć go z zdarzeniami oncopy oraz onpaste i onbefastepaste, aby uzyskać zachowanie schowka. Oto kod, aby to osiągnąć:
źródło
Mój błąd. Działa to tylko w IE.
Oto jeszcze jeden sposób na skopiowanie tekstu:
źródło
To była jedyna rzecz, jaką kiedykolwiek pracowałem, po tym, jak szukałem różnych sposobów w Internecie. To jest niechlujny temat. Istnieje wiele rozwiązań opublikowanych na całym świecie i większość z nich nie działa. To działało dla mnie:
UWAGA: Ten kod będzie działał tylko wtedy, gdy zostanie wykonany jako bezpośredni kod synchroniczny do czegoś takiego jak metoda „onClick”. Jeśli wywołasz asynchroniczną odpowiedź do Ajax lub w jakikolwiek inny asynchroniczny sposób, to nie zadziała.
Zdaję sobie sprawę, że ten kod będzie wyświetlać na ekranie komponent o szerokości 1 piksela przez milisekundę, ale postanowiłem nie przejmować się tym, co inni mogą rozwiązać, jeśli to prawdziwy problem.
źródło
Aby skopiować zaznaczony tekst („Tekst do skopiowania”) do schowka, utwórz Zakładkę (zakładkę przeglądarki, która wykonuje JavaScript) i uruchom ją (kliknij na nią). Stworzy tymczasowy obszar tekstowy.
Kod z GitHub:
https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d
źródło