TL;博士
即使writeText()
是用户事件的直接结果,是否可以让剪贴板 API 从 Safari 中的 Axios 获取请求的结果中写入文本?
长版
我有一个异步按钮单击事件,在该单击事件中,我使用 Axios 来获取另一个页面的 HTML。我想获取该字符串并使用剪贴板 API 将其保存到剪贴板。
这在 Chrome 和 Firefox 中有效,但在 Safari 中存在一些问题,我将在下面展示。
测试:
- 铬 88.0.4324.192
- 火狐 78.7.1
- Safari 14.0.3
我能找到的与这类事情相关的最接近的 SO 问题是Javascript / Clipboard API / Safari iOS / NotAllowedError Message但我觉得我的 Clipboard API 调用是直接在用户事件中调用的。
尝试 1 在 Safari 中工作
copyButton.addEventListener('click', async (event) => {
try {
const {data: html} = await axios.get('https://website-to-copy.com');
await navigator.clipboard.writeText(html);
console.log('copy was a success');
} catch (error) {
console.log(error);
}
});
Safari 中的结果 1
- 请求成功
- 无法写入剪贴板
- NotAllowedError:当前上下文中用户代理或平台不允许该请求,可能是因为用户拒绝了权限。
我对结果 1 的看法
当时我想这会奏效。该writeText()
调用是用户事件的直接结果,我只是传入一个字符串......即使该字符串是 Axios 获取请求的结果。当它不起作用时,我认为 get 请求一定有什么东西会抛出权限。
尝试 2 在 Safari 中工作
copyButton.addEventListener('click', async (event) => {
try {
const {data: html} = await axios.get('https://website-to-copy.com');
// throw in a random string thinking maybe something
// in the get request is throwing Clipboard API off
await navigator.clipboard.writeText('some random text to copy');
console.log('copy was a success');
} catch (error) {
console.log(error);
}
});
Safari 中的结果 2
- 请求成功
- 无法写入剪贴板
- NotAllowedError:当前上下文中用户代理或平台不允许该请求,可能是因为用户拒绝了权限。
我对结果 2 的看法
当我的随机文本没有复制时,我真的很惊讶。当尝试 #1 失败时,我决定保留 get 请求,但只是提供writeText()
一些随机文本,无论如何都与 get 请求无关,只是为了看看它是否会复制。显然,get 请求仍在影响 Clipboard API。
尝试 3 开始在 Safari 中工作
copyButton.addEventListener('click', async (event) => {
try {
// remove get request and see if i can get anything to
// copy to clipboard
//const {data: html} = await axios.get('https://website-to-copy.com');
await navigator.clipboard.writeText('some random text to copy');
console.log('copy was a success');
} catch (error) {
console.log(error);
}
});
Safari 中的结果 3
- 文本已成功复制到剪贴板
我对结果 3 的看法
好吧,我很高兴我可以在 Safari 中使用剪贴板 API 成功复制文本。但是我真的很想复制获取请求的结果。