Mengapa pada peranti Android, jika terdapat `alert()` sebelum `navigator.clipboard.writeText`, ia tidak boleh berjaya menyalin teks ke papan keratan?
P粉386318086
2023-08-22 19:21:37
<p>Apabila cuba menyalin beberapa teks menggunakan <code>navigator.clipboard.writeText()</code> pada Chrome pada Android, ia berfungsi dengan baik selagi saya tidak menunjukkan kotak amaran selepas itu. Sebaik sahaja saya memaparkan amaran() ia tidak berfungsi lagi. </p>
<p>Sebagai contoh, kod berikut berfungsi seperti yang dijangkakan: </p>
<p><br /></p>
<pre class="brush:js;toolbar:false;">function myFunction() {
var copyText = document.getElementById("myInput");
copyText.select();
copyText.setSelectionRange(0, 99999);
navigator.clipboard.writeText(copyText.value);
}</pre>
<pre class="brush:html;toolbar:false;"><input type="text" value="Hello world" id="myInput" style="width:auto">
<butang onclick="myFunction()">copy</button></pre>
<p><br /></p>
<p>Walau bagaimanapun kod di bawah tidak berfungsi, tidak menimbulkan sebarang ralat dalam konsol dan berfungsi dengan baik pada Chrome pada PC, tetapi tidak pada Android. </p>
<p><br /></p>
<pre class="brush:js;toolbar:false;">function myFunction()
{
var copyText = document.getElementById("myInput");
copyText.select();
copyText.setSelectionRange(0, 99999);
navigator.clipboard.writeText(copyText.value);
alert("Teks berjaya disalin")
}</pre>
<pre class="brush:html;toolbar:false;"><input type="text" value="Hello world" id="myInput" style="width:auto" >
<butang onclick="myFunction()" >copy</button></pre>
<p><br /></p>
<p>Adakah sesiapa tahu apa yang berlaku? terima kasih. </p>
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
dalam kebanyakan kesPromise
在写入剪贴板时。因此,我们可以使用ClipboardItem
将一个Promise
传递给write
方法。我建议您使用 write 而不是writeText
Mudah bercakap, tunjukkan saya Kod:
Penggunaan:
PENTING: Uji melalui butang dan
onclick
acara, bukan dalam konsol.Kerana kaedah
navigator.clipboard.writeText
mengembalikan Janji dan kod anda tidak menunggu hasilnya.Jika anda membetulkannya mengikut kod di bawah, anda sepatutnya baik:
Untuk maklumat lanjut tentangJanji dan kaedah
Promise
和navigator.clipboard.writeText
, sila layari pautan berikut:Janji di JavaScript.info
Berinteraksi dengan papan keratan di MDN