2

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 成功复制文本。但是我真的很想复制获取请求的结果。

4

0 回答 0