Копировать API буфера обмена в буфер обмена, а затем открывать новое окно? Избегайте потери фокуса окна

Можно ли открыть новую вкладку браузера после того, как содержимое было скопировано в буфер обмена?

В настоящее время я получаюUncaught (in promise) DOMException: Document is not focused.я так понимаю, что я не могу открыть новое окно в функции, так как я знаю, что вкладка должна быть активной, чтобы копирование в буфер обмена работало (без разрешений).https://web.dev/асинхронный буфер обмена/

Нужно ли мне как-то запускать код вне функции, т.е. событие или наблюдатель, чтобы определить, когда функция copyToClipboard была выполнена? Или любой другой способ запустить его в функции и убедиться, что запись в буфер обмена завершена до открытия нового окна? (Я пробовал даже setTimeout безрезультатно).

HTML

      <body>
<button type=button onclick="copyToClipboard()">Copy</button>
<div id="template">
  Test
</div>
</body>

Js

      function copyToClipboard(){
    try {
      const htmlCode = template.innerHTML;
      const blobInput = new Blob([htmlCode], { type: 'text/html' })
      navigator.clipboard.write([new ClipboardItem({ 'text/html': blobInput })])
      alert('Copied')

var win = window.open('https://mail.google.com/mail/', '_blank');
  if (win) {
      //Browser has allowed it to be opened
      win.focus();
  } else {
      //Browser has blocked it
      alert('Please allow popups for this website');
  }
    } catch (e) {
      alert(e)
    }
  };

Я также пытался использовать .then после навигатора с той же проблемой.

      navigator.clipboard.write([new ClipboardItem({ 'text/html': blobInput })]).then( window.open('https://mail.google.com/mail/', '_blank') );

ОБНОВЛЯТЬ

Выяснил, что мне нужно использовать асинхронность и ждать, это сработало!https://stackoverflow.com/a/72990164/8719001

      async function openurl() {
      await navigator.clipboard.writeText('TextToCopy');
      window.open('url');
    }

0 ответов

Другие вопросы по тегам