问题
javascript实现将内容存入到剪切板时,在点击复制按钮之后,ios系统一直提示复制失败,而安卓和windows电脑上都没问题。
场景
一个H5看课考试项目,当用户在微信中打开网址进行考试时,如果检测到摄像头调用失败,则提示用户复制当前链接去其它浏览器进行尝试。此时为了实现无感登录,所以在用户点击复制按钮时,会请求接口生成一个code码附带在链接上存入剪贴板,供用户在新的浏览器中打开时换取token信息进行无感登录。
代码如下:
if (isWeixin()) {
let that = this;
that.$message.showModal({
title: '温馨提示',
content: '摄像头调用失败,请点击复制按钮到其它浏览器打开并进行考试',
confirmText: '复制',
confirm: () => {
that.$http.post('/auth/share').then((res) => {
if (res.code == 0) {
let code = res.data.code;
let url = location.href + '&code=' + code;
setTimeout(() => {
uni.setClipboardData({
data: url,
success: () => {
that.$message.showToast({ title: '复制成功', duration: 1000 }).then(() => {
that.$Router.back();
});
},
fail: () => {
that.$message.showToast({ title: '复制失败', duration: 1000 }).then(() => {
that.$Router.back();
});
},
});
}, 100);
}
});
},
cancel: () => {
that.$Router.back();
},
});
}
解决方案
尝试用原生方式实现以及用uni-app自带的uni.setClipboardData
,但结果都不行。
最后突然想,既然是异步请求,那就将复制到剪贴板这一步的操作延迟执行,结果setTimeout
函数延迟了100毫秒,果然生效了。
虽然问题解决了,但是在网上搜索为什么要延时执行复制动作,并没有很好的答案,希望有知道原因的小伙伴指点迷津。