API буфера обмена, используемый в сочетании с Axios в событии клика

TL;DR

Можно ли заставить API буфера обмена записывать текст из результата запроса на получение Axios в Safari, даже если это прямой результат пользовательского события?


Длинная версия

У меня есть событие нажатия асинхронной кнопки, и внутри этого события нажатия я использую Axios для получения HTML-кода другой страницы. Я хочу взять эту строку и сохранить ее в буфер обмена с помощью API буфера обмена.

Это работает в Chrome и Firefox, но в Safari есть некоторые проблемы, о которых я расскажу ниже.

Тестирование в:

  • Хром 88.0.4324.192
  • Фаерфокс 78.7.1
  • Сафари 14.0.3

Ближайшая проблема SO, которую я мог найти в связи с такими вещами, - это Javascript/API буфера обмена/Safari iOS/NotAllowedError Message, но я чувствую, что мой вызов 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);
  }
});

Результат 1 в Сафари

  • Запрос успешно сделан
  • Ошибка записи в буфер обмена
    • NotAllowedError: запрос не разрешен агентом пользователя или платформой в текущем контексте, возможно, потому, что пользователь отказал в разрешении.

Мои мысли о результате 1

В то время я думал, что это сработает. Вызов является прямым результатом пользовательского события, и я просто передаю строку... хотя эта строка является результатом запроса на получение Axios. Когда это не сработало, я подумал, что должно быть что-то с запросом на получение, отбрасывающим разрешения.


Попытка 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);
  }
});

Результат 2 в Сафари

  • Запрос успешно сделан
  • Ошибка записи в буфер обмена
    • NotAllowedError: запрос не разрешен агентом пользователя или платформой в текущем контексте, возможно, потому, что пользователь отказал в разрешении.

Мои мысли о результате 2

Я был очень удивлен, когда мой случайный текст не скопировался. Когда попытка № 1 не удалась, я решил оставить запрос на получение, а просто передать writeText()какой-то случайный текст, никак не связанный с запросом на получение, просто чтобы посмотреть, скопируется ли он. Очевидно, что запрос на получение по-прежнему влияет на 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);
  }
});

Результат 3 в Сафари

  • Текст успешно скопирован в буфер обмена

Мои мысли о результате 3

Что ж, я рад, что могу успешно копировать текст с помощью API буфера обмена в Safari. Однако я действительно хотел бы скопировать результат запроса на получение.

1 ответ

      copyButton.addEventListener('click', async (event) => {
    try {  
        const { ClipboardItem } = window;
        await navigator.clipboard.write([new ClipboardItem({ "text/plain": getUrl() })]).then(()=>console.log("copied"))
    } catch (error) {
        console.log(error);
    }
});
    
const getUrl = () => {
    const {data: html} = await axios.get('https://website-to-copy.com');
    return html;
}
Другие вопросы по тегам