Копировать 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');
}