Rumah > Soal Jawab > teks badan
P粉3549487242023-08-23 18:36:44
Sebab navigator.clipboard.writetext
Sebab mengapa ia tidak berkesan:
Isu Keserasian: Kaedah ini ditambah kemudian selepas kaedah document.exec("copy")
ditamatkan. Dalam beberapa versi pelayar kaedah ini tidak akan berfungsi dan anda harus menyemak sama ada kaedah ini tersedia.
Dokumen Tidak Difokuskan: Jika anda menulis kandungan pada papan keratan tanpa sebarang interaksi pengguna, penyemak imbas akan menyekat permintaan anda dan membuang ralat dalam Janji kaedah ini. Bayangkan pengguna ingin menyalin rentetan yang anda muatkan dari internet (ajax
)。如果此 ajax
Permintaan mengambil sedikit masa, fokus penyemak imbas akan tamat tempoh dan dalam pengalaman saya penyalinan tidak dapat diselesaikan.
Kebenaran Tidak Dibenarkan: Kadangkala pengguna boleh menghalang penyemak imbas daripada menyalin secara automatik ke papan keratan dengan mengedit tetapan privasi dan keselamatan mereka. Sebelum menyalin, semak kebenaran untuk menulis ke papan keratan. Walau bagaimanapun, kebenaran clipboard-write
diberikan secara automatik kepada halaman apabila ia berada dalam tab aktif.
Isu Asynchronous: Menyalin ke papan keratan ialah operasi tak segerak dan anda harus menunggu sehingga kod anda menyelesaikan kerjanya.
Tapak Web HTTP: Ciri ini hanya tersedia dalam konteks selamat (HTTPS), dalam beberapa atau semua penyemak imbas yang disokong.
Isu Apple Safari: API Papan Klip Apple menjangkakan Promise
在写入剪贴板时。因此,我们可以使用 ClipboardItem
将一个 Promise
传递给 write
方法。我建议您使用 write 而不是 writeText
Mudah bercakap, tunjukkan saya Kod:
function copy(text) { return new Promise((resolve, reject) => { if (typeof navigator !== "undefined" && typeof navigator.clipboard !== "undefined" && navigator.permissions !== "undefined") { const type = "text/plain"; const blob = new Blob([text], { type }); const data = [new ClipboardItem({ [type]: blob })]; navigator.permissions.query({name: "clipboard-write"}).then((permission) => { if (permission.state === "granted" || permission.state === "prompt") { navigator.clipboard.write(data).then(resolve, reject).catch(reject); } else { reject(new Error("Permission not granted!")); } }); } else if (document.queryCommandSupported && document.queryCommandSupported("copy")) { var textarea = document.createElement("textarea"); textarea.textContent = text; textarea.style.position = "fixed"; textarea.style.width = '2em'; textarea.style.height = '2em'; textarea.style.padding = 0; textarea.style.border = 'none'; textarea.style.outline = 'none'; textarea.style.boxShadow = 'none'; textarea.style.background = 'transparent'; document.body.appendChild(textarea); textarea.focus(); textarea.select(); try { document.execCommand("copy"); document.body.removeChild(textarea); resolve(); } catch (e) { document.body.removeChild(textarea); reject(e); } } else { reject(new Error("None of copying methods are supported by this browser!")); } }); }
Penggunaan:
try { await copy("Hay yah!"); } catch(e) { console.error(e); }
PENTING: Uji melalui butang dan onclick
acara, bukan dalam konsol.
P粉7594574202023-08-23 15:36:33
Kerana kaedah navigator.clipboard.writeText
mengembalikan Janji dan kod anda tidak menunggu hasilnya.
Jika anda membetulkannya mengikut kod di bawah, anda sepatutnya baik:
function myFunction() { var copyText = document.getElementById("myInput"); copyText.select(); copyText.setSelectionRange(0, 99999); navigator.clipboard .writeText(copyText.value) .then(() => { alert("成功复制"); }) .catch(() => { alert("出了点问题"); }); }
Untuk maklumat lanjut tentang Promise
和navigator.clipboard.writeText
, sila layari pautan berikut:
Janji di JavaScript.info
Berinteraksi dengan papan keratan di MDN