做了一个需求,真是耗了一下午的时间,需求是后端给我的一端文本,我需要复制下来,所处环境是微信公众号,前两天我以为我已经开发好了,在微信开发者工具和同事的手机上面测试都没问题,今天拿我的手机测试,结果有所不同,下面我来详细说一下过程以及解决方法。
我之前用的 复制文本 方法 是
// 复制方法一
function copyTextToClipboardOld(text) {
/* 创建一个临时的textarea元素 */
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed'; // 防止滚动
document.body.appendChild(textarea);
textarea.select();
try {
const successful = document.execCommand('copy');
const msg = successful ? '成功' : '失败';
console.log('文本复制' + msg);
} catch (err) {
console.error('复制失败:', err);
}
document.body.removeChild(textarea);
}
// 复制方法二
async function copyTextToClipboard(text) {
try {
await navigator.clipboard.writeText(text);
console.log('文本已复制到剪贴板');
} catch (err) {
console.error('复制失败:', err);
}
}
// 使用示例
const textToCopy = '这是一段需要复制的文本';
copyTextToClipboard(textToCopy);
但是在后面的过程中,我就换成了 copy-to-clipboard 这个包,所以后面的解决办法,如果针对前面的两个复制方法,没有用,可以 换成 copy-to-clipboard 这个包尝试
解决方法:在苹果的复制中,不要复制功能放在请求中,在复制之前先请求,存好数据,后面需要复制的时候直接复制就好了
下面是我的案例代码
<template>
<div>
<van-button type="primary"
@click="copyOne">复制一,全部可以</van-button>
<van-button type="primary"
@click="copyTwo">复制二,苹果在微信公众号会有问题</van-button>
</div>
</template>
<script>
import copyToClipboard from 'copy-to-clipboard';
import axios from 'axios'
export default {
name: 'test1',
data () {
return {
msg: '一段话'
}
},
methods: {
copyOne () {
const result = copyToClipboard(this.msg)
if (result) {
this.$toast('复制成功')
} else {
this.$toast('复制失败')
}
},
copyTwo () {
this.getData().then(() => {
const result = copyToClipboard(this.msg)
if (result) {
this.$toast('复制成功')
} else {
this.$toast('复制失败')
}
}).catch(() => {
this.$toast('获取数据失败')
})
},
getData () {
return new Promise((resolve, reject) => {
axios({
method: 'get',
url: 'https://api.uomg.com/api/rand.qinghua', // 随便找的接口,模拟开发中的请求,如果接口不可以用了,自己找一个来模拟
}).then((res) => {
this.msg = res.data.content
// console.log(res, 'res');
resolve()
}).catch((err) => {
// console.log(err, 'err');
reject()
})
})
},
}
}
</script>
<style>
</style>