Apa cara terbaik untuk menyalin teks ke clipboard? (multi-browser)
Saya telah mencoba:
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);
}
}
tetapi di Internet Explorer itu memberikan kesalahan sintaksis. Di Firefox, katanya unsafeWindow is not defined
.
Trik yang bagus tanpa flash: Bagaimana Trello mengakses clipboard pengguna?
javascript
clipboard
copy-paste
Santiago Corredoira
sumber
sumber
Jawaban:
Gambaran
Ada tiga API peramban utama untuk disalin ke clipboard:
[navigator.clipboard.writeText]
document.execCommand('copy')
Catatan pengembangan umum
Jangan berharap perintah terkait clipboard berfungsi saat Anda menguji kode di konsol. Secara umum halaman tersebut harus aktif (Async Clipboard API) atau memerlukan interaksi pengguna (misalnya klik pengguna) untuk mengizinkan (
document.execCommand('copy')
) mengakses clipboard lihat di bawah untuk lebih jelasnya.PENTING (dicatat di sini 2020/02/20)
Perhatikan bahwa sejak posting ini pada awalnya ditulis, penghentian izin di lintas asal IFRAME dan IFRAME "sandboxing" IFRAME lainnya mencegah demo tertanam tombol "Jalankan cuplikan kode" tombol dan "contoh codepen.io" dari bekerja di beberapa browser (termasuk Chrome dan Microsoft Edge ).
Untuk mengembangkan membuat halaman web Anda sendiri, sajikan halaman itu melalui koneksi HTTPS untuk diuji dan dikembangkan.
Berikut ini adalah halaman uji / demo yang menunjukkan kode berfungsi: https://deanmarktaylor.github.io/clipboard-test/
Async + Fallback
Karena tingkat dukungan browser untuk Async Clipboard API baru, Anda mungkin ingin mundur ke
document.execCommand('copy')
metode untuk mendapatkan jangkauan browser yang baik.Berikut ini adalah contoh sederhana (mungkin tidak berfungsi tertanam di situs ini, baca catatan "penting" di atas):
(contoh codepen.io mungkin tidak berfungsi, baca catatan "penting" di atas) Perhatikan bahwa cuplikan ini tidak berfungsi dengan baik di pratinjau tertanam Stack Overflow, Anda dapat mencobanya di sini: https://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011
API Clipboard Async
Perhatikan bahwa ada kemampuan untuk "meminta izin" dan menguji akses ke clipboard melalui API izin di Chrome 66.
document.execCommand ('copy')
Sisa dari pos ini membahas nuansa dan detail
document.execCommand('copy')
API.Dukungan Browser
document.execCommand('copy')
Dukungan JavaScript telah berkembang, lihat tautan di bawah untuk pembaruan browser:Contoh sederhana
(mungkin tidak berfungsi tertanam di situs ini, baca catatan "penting" di atas)
Contoh Kompleks: Salin ke clipboard tanpa menampilkan input
Contoh sederhana di atas berfungsi dengan baik jika ada elemen
textarea
atauinput
yang terlihat di layar.Dalam beberapa kasus, Anda mungkin ingin menyalin teks ke clipboard tanpa menampilkan
input
/textarea
elemen. Ini adalah salah satu contoh cara untuk mengatasi ini (pada dasarnya memasukkan elemen, salin ke clipboard, hapus elemen):Diuji dengan Google Chrome 44, Firefox 42.0a1 dan Internet Explorer 11.0.8600.17814.
(mungkin tidak berfungsi tertanam di situs ini, baca catatan "penting" di atas)
Catatan tambahan
Hanya berfungsi jika pengguna mengambil tindakan
Semua
document.execCommand('copy')
panggilan harus dilakukan sebagai akibat langsung dari tindakan pengguna, mis. Klik pengendali acara. Ini adalah langkah untuk mencegah mengacaukan clipboard pengguna ketika mereka tidak mengharapkannya.Lihat posting Google Developers di sini untuk info lebih lanjut.
API Clipboard
Perhatikan spesifikasi draft API Clipboard lengkap dapat ditemukan di sini: https://w3c.github.io/clipboard-apis/
Apakah ini didukung?
document.queryCommandSupported('copy')
harus kembalitrue
jika perintah "didukung oleh browser".document.queryCommandEnabled('copy')
kembalitrue
jikadocument.execCommand('copy')
akan berhasil jika dipanggil sekarang. Memeriksa untuk memastikan perintah dipanggil dari utas yang dimulai pengguna dan persyaratan lainnya dipenuhi.Namun sebagai contoh masalah kompatibilitas browser, Google Chrome dari ~ April hingga ~ Oktober 2015 hanya kembali
true
daridocument.queryCommandSupported('copy')
jika perintah dipanggil dari utas yang dimulai pengguna.Perhatikan detail kompatibilitas di bawah ini.
Detail Kompatibilitas Browser
Sementara panggilan sederhana untuk
document.execCommand('copy')
dibungkus dengantry
/catch
blok yang disebut sebagai hasil dari klik pengguna akan membuat Anda mendapatkan kompatibilitas yang paling banyak, yang berikut memiliki beberapa ketentuan:Setiap panggilan ke
document.execCommand
,document.queryCommandSupported
ataudocument.queryCommandEnabled
harus dibungkus dengantry
/catch
blok.Implementasi browser yang berbeda dan versi browser melempar berbagai jenis pengecualian ketika dipanggil alih-alih kembali
false
.Implementasi browser yang berbeda masih dalam fluks dan Clipboard API masih dalam konsep, jadi ingatlah untuk melakukan pengujian Anda.
sumber
var str = "word";
?<textarea>
dengan JS, tambahkan kedocument.body
, atur nilainya ke variabel, dan gunakan sesuai langkahcopyTextarea
, kemudian hapus segera setelah konten disalin.Menyalin otomatis ke clipboard mungkin berbahaya, oleh karena itu sebagian besar browser (kecuali IE) membuatnya sangat sulit. Secara pribadi, saya menggunakan trik sederhana berikut:
Pengguna disajikan dengan kotak prompt, di mana teks yang akan disalin sudah dipilih. Sekarang cukup untuk menekan Ctrl+ Cdan Enter(untuk menutup kotak) - dan voila!
Sekarang operasi penyalinan clipboard adalah AMAN, karena pengguna melakukannya secara manual (tetapi dengan cara yang sangat mudah). Tentu saja, berfungsi di semua browser.
sumber
Pendekatan berikut berfungsi di Chrome, Firefox, Internet Explorer dan Edge, dan dalam versi terbaru Safari (dukungan salin ditambahkan dalam versi 10 yang dirilis Oktober 2016).
Catatan: Anda tidak akan melihat textarea, karena ditambahkan dan dihapus dalam permintaan kode Javascript yang sama dan sinkron.
Beberapa hal yang harus diperhatikan jika Anda menerapkan ini sendiri:
Fungsi di bawah ini harus menangani semua masalah berikut sebersih mungkin. Silakan tinggalkan komentar jika Anda menemukan masalah atau punya saran untuk memperbaikinya.
https://jsfiddle.net/fx6a6n6x/
sumber
Ini pendapat saya tentang yang itu ...
@korayem: Perhatikan bahwa menggunakan
input
bidang html tidak akan menghormati jeda baris\n
dan akan meratakan teks apa pun menjadi satu baris.Seperti yang disebutkan oleh @nikksan di komentar, menggunakan
textarea
akan memperbaiki masalah sebagai berikut:sumber
\n
?\r\n
untuk jeda barisJika Anda menginginkan solusi yang benar-benar sederhana (membutuhkan waktu kurang dari 5 menit untuk berintegrasi) dan terlihat bagus di luar kotak, maka Clippy adalah alternatif yang bagus untuk beberapa solusi yang lebih kompleks.
Itu ditulis oleh salah satu pendiri GitHub. Contoh kode embed Flash di bawah ini:
Ingatlah untuk mengganti
#{text}
dengan teks yang perlu Anda salin, dan#{bgcolor}
dengan warna.sumber
Membaca dan memodifikasi clipboard dari halaman web menimbulkan masalah keamanan dan privasi. Namun, di Internet Explorer, dimungkinkan untuk melakukannya. Saya menemukan cuplikan contoh ini :
sumber
execCommand(\\’copy\\’);
, jika tidak menyalin ke clipboard untuk IE? @mrBornaif(!document.all)
tetapiif(!r.execCommand)
jangan ada orang lain yang mengimplementasikannya! Document.all sama sekali tidak relevan dengan ini.Saya baru-baru ini menulis posting blog teknis tentang masalah ini (saya bekerja di Lucidchart dan kami baru-baru ini melakukan perombakan di clipboard kami).
Menyalin teks biasa ke clipboard relatif sederhana, dengan asumsi Anda ingin melakukannya selama acara penyalinan sistem (pengguna menekan CtrlCatau menggunakan menu browser).
Menempatkan teks pada clipboard bukan selama acara penyalinan sistem jauh lebih sulit. Sepertinya beberapa dari jawaban referensi cara lain untuk melakukannya melalui Flash, yang merupakan satu-satunya cara lintas-browser untuk melakukannya (sejauh yang saya mengerti).
Selain itu, ada beberapa opsi berdasarkan browser-per-browser.
Ini adalah yang paling sederhana di IE, di mana Anda dapat mengakses objek clipboard Data kapan saja dari JavaScript melalui:
(Ketika Anda mencoba melakukan ini di luar sistem memotong, menyalin, atau menempel acara, namun, IE akan meminta pengguna untuk memberikan izin clipboard aplikasi web.)
Di Chrome, Anda dapat membuat ekstensi Chrome yang akan memberi Anda izin papan klip (inilah yang kami lakukan untuk Lucidchart). Maka bagi pengguna dengan ekstensi Anda yang terpasang, Anda hanya perlu mem-flash event sistem sendiri:
Sepertinya Firefox memiliki beberapa opsi yang memungkinkan pengguna untuk memberikan izin ke situs tertentu untuk mengakses clipboard, tetapi saya belum mencoba semua ini secara pribadi.
sumber
clipboard.js adalah utilitas kecil, non-Flash, yang memungkinkan penyalinan data teks atau HTML ke clipboard. Ini sangat mudah digunakan, cukup sertakan .js dan gunakan sesuatu seperti ini:
clipboard.js juga ada di GitHub .
sumber
ZeroClipboard adalah solusi lintas-browser terbaik yang saya temukan:
Jika Anda memerlukan dukungan non-flash untuk iOS, Anda cukup menambahkan back-back:
http://zeroclipboard.org/
https://github.com/zeroclipboard/ZeroClipboard
sumber
src
dalam tag skrip). Saya merasa bahwa dokumentasi mereka cukup tetapi tidak efisien.Pada tahun 2018, inilah cara Anda melakukannya:
Ini digunakan dalam kode Angular 6+ saya seperti:
Jika saya meneruskan sebuah string, itu menyalinnya. Jika tidak ada, itu menyalin URL halaman.
Lebih banyak senam untuk hal-hal clipboard dapat dilakukan juga. Lihat informasi lebih lanjut di sini:
Membuka Blokir Akses Clipboard
sumber
Dari salah satu proyek yang saya kerjakan, plugin jQuery copy-to-clipboard yang memanfaatkan pustaka Zero Clipboard .
Lebih mudah digunakan daripada plugin Zero Clipboard asli jika Anda adalah pengguna jQuery yang berat.
sumber
text()
daripadainnerHTML()
jika Anda suka ..innerHTML
sudah lama mendukung cross-browser. Hanya karena Microsoft awalnya datang dengan ide itu tidak membuatnya tidak dapat diandalkan atau berpemilik. Sekarang juga akhirnya ditambahkan ke spesifikasi resmi (setelah setiap vendor browser utama sudah menambahkan dukungan untuk itu ... huh ).92KB
sangat besar. Hingga LTE jatuh tempo, GPRS adalah standar data seluler WW , dan ini dimulai pada1 KB/s
. Lakukan perhitungan sendiri.Karena Chrome 42+ dan Firefox 41+ sekarang mendukung perintah document.execCommand ('copy') . Jadi saya membuat beberapa fungsi untuk kemampuan copy-to-clipboard lintas-browser menggunakan kombinasi jawaban lama Tim Down dan jawaban Pengembang Google :
sumber
Saya menggunakan ini dengan sangat sukses ( tanpa jQuery atau kerangka kerja lainnya).
Peringatan
Tab dikonversi ke spasi (setidaknya di Chrome).
sumber
Saya menemukan solusi berikut:
Pada penangan tombol bawah membuat tag "pre". Kami mengatur konten untuk disalin ke tag ini, lalu membuat pilihan pada tag ini dan mengembalikan true di handler. Ini memanggil penangan standar chrome dan menyalin teks yang dipilih.
Dan jika perlu, Anda dapat mengatur batas waktu untuk fungsi untuk mengembalikan pilihan sebelumnya. Implementasi saya di Mootools:
Pemakaian:
Pada paste, ia menciptakan textarea dan bekerja dengan cara yang sama.
PS mungkin solusi ini dapat digunakan untuk membuat solusi cross-browser sepenuhnya tanpa flash. Ini bekerja di FF dan Chrome.
sumber
Metode lain akan menyalin teks biasa ke clipboard. Untuk menyalin HTML (yaitu, Anda dapat menempelkan hasilnya ke editor WSIWYG), Anda dapat melakukan hal berikut di IE ONLY . Ini pada dasarnya berbeda dari metode lain, karena browser benar-benar terlihat memilih konten.
sumber
Saya telah mengumpulkan apa yang saya pikir adalah yang terbaik.
Ini dia:
Pemakaian:
copyToClipboard('some text')
sumber
Pada Flash 10, Anda hanya dapat menyalin ke clipboard jika tindakan berasal dari interaksi pengguna dengan objek Flash. ( Baca bagian terkait dari pengumuman Adobe 10 Flash )
Solusinya adalah terlalu banyak objek flash di atas tombol Salin, atau elemen apa pun yang memulai salinan. Zero Clipboard saat ini adalah perpustakaan terbaik dengan implementasi ini. Pengembang Flash berpengalaman mungkin hanya ingin membuat perpustakaan sendiri.
sumber
sumber
Saya menemukan solusi berikut:
Saya memiliki teks dalam input tersembunyi. Karena
setSelectionRange
tidak bekerja pada input tersembunyi, saya mengubah sementara jenis ke teks, menyalin teks, dan kemudian membuatnya tersembunyi lagi. Jika Anda ingin menyalin teks dari suatu elemen, Anda bisa meneruskannya ke fungsi dan menyimpan kontennya di variabel target.sumber
Salin teks dari input HTML ke clipboard:
Catatan: The
document.execCommand()
Metode tidak didukung di Internet Explorer 9 dan sebelumnya.Sumber : W3Schools - Salin Teks ke Clipboard
sumber
Ada banyak jawaban, namun ingin menambahkannya (jQuery). Berfungsi bagus pada peramban apa pun, juga peramban seluler (yaitu, meminta keamanan, tetapi ketika Anda menerimanya berfungsi dengan baik).
Dalam kode Anda:
sumber
Ini sedikit kombinasi antara jawaban yang lain.
Ini menggunakan jQuery, tetapi tentu saja tidak harus. Anda dapat mengubahnya jika Anda mau. Saya baru saja meminta jQuery. Anda juga dapat menambahkan beberapa CSS untuk memastikan input tidak muncul. Misalnya sesuatu seperti:
Atau tentu saja Anda juga bisa melakukan beberapa style inline
sumber
textToCopy
berisi\n
Di browser selain IE Anda harus menggunakan objek flash kecil untuk memanipulasi clipboard, misalnya
sumber
Saya memiliki masalah yang sama dengan membangun edit kisi khusus (seperti Excel) dan kompatibilitas dengan Excel. Saya harus mendukung pemilihan beberapa sel, menyalin dan menempel.
Solusi: buat sebuah textarea di mana Anda akan memasukkan data untuk disalin pengguna (untuk saya ketika pengguna memilih sel), atur fokus padanya (misalnya, ketika pengguna menekan Ctrl) dan pilih seluruh teks.
Jadi, ketika pengguna menekan Ctrl+ Cdia akan menyalin sel-sel yang dia pilih. Setelah pengujian hanya mengubah ukuran textarea menjadi satu pixel (saya tidak menguji apakah itu akan berfungsi pada layar: tidak ada). Ini bekerja dengan baik di semua browser, dan transparan bagi pengguna.
Menempel - Anda bisa melakukan hal yang sama seperti ini (berbeda pada target Anda) - tetap fokus pada textarea dan menangkap acara tempel menggunakan onpaste (dalam proyek saya, saya menggunakan textareas dalam sel untuk mengedit).
Saya tidak bisa menempelkan contoh (proyek komersial), tetapi Anda mendapatkan idenya.
sumber
Saya telah menggunakan clipboard.js.
Kita bisa mendapatkannya di npm:
Dan juga pada Bower
Penggunaan & contoh ada di https://zenorocha.github.io/clipboard.js/ .
sumber
Ini adalah perluasan dari jawaban @ Chase, dengan keuntungan bahwa ia akan bekerja untuk elemen IMAGE dan TABLE, tidak hanya DIV pada IE9.
sumber
Sepertinya saya salah membaca pertanyaan, tetapi untuk referensi, Anda dapat mengekstrak berbagai DOM (bukan ke clipboard; kompatibel dengan semua browser modern), dan menggabungkannya dengan acara oncopy dan onpaste dan onbeforepaste untuk mendapatkan perilaku clipboard. Berikut kode untuk mencapai ini:
sumber
Salahku. Ini hanya berfungsi di IE.
Berikut ini cara lain untuk menyalin teks:
sumber
Ini adalah satu-satunya hal yang pernah saya kerjakan, setelah mencari berbagai cara di Internet. Ini adalah topik yang berantakan. Ada banyak solusi yang diposting di seluruh dunia dan kebanyakan dari mereka tidak berfungsi. Ini bekerja untuk saya:
CATATAN: Kode ini hanya akan berfungsi ketika dijalankan sebagai kode sinkron langsung ke sesuatu seperti metode 'onClick'. Jika Anda memanggil respons asinkron ke Ajax atau dengan cara asinkron apa pun, itu tidak akan berfungsi.
Saya menyadari kode ini akan menunjukkan komponen lebar 1-pixel terlihat di layar selama satu milidetik, tetapi memutuskan untuk tidak khawatir tentang itu, yang merupakan sesuatu yang orang lain dapat mengatasi jika masalah nyata.
sumber
Untuk menyalin teks yang dipilih ('Teks Untuk Disalin') ke clipboard Anda, buat Bookmarklet (bookmark browser yang mengeksekusi JavaScript) dan jalankan (klik di atasnya). Ini akan membuat textarea sementara.
Kode dari GitHub:
https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d
sumber