Я пытаюсь получить событие, когда contentWindow.print()
закончен (из фрейма).
Я видел этот ответ , и он дал мне много советы о том, как это сделать, но ни один из ответов не работает для iframe contentWindow
.
Итак, вот какая у меня есть установка:
const delay = (milliseconds) =>
new Promise(resolve => setTimeout(resolve, milliseconds));
async function print(docUrl) {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.classList.add('hidden-iframe');
console.log(docUrl);
try {
await new Promise<void>((resolve, reject) => {
iframe.src = docUrl;
const id = setTimeout(() => {
reject(new Error('iframe timeout'));
}, 10 * 1000);
iframe.addEventListener('load', () => {
clearTimeout(id);
resolve();
});
});
// wait 1 second just in case
await delay(1000);
const { contentWindow } = iframe;
if (!contentWindow) {
throw new Error('Could not get content window');
}
contentWindow.print();
// TODO: ? none of these events fire
// ???
contentWindow.addEventListener('afterprint', e =>
console.log('afterprint', e),
);
contentWindow
.matchMedia('print')
.addListener(e => console.log('print media', e));
// ???
// this delay is just for testing.
await delay(10 * 1000);
} finally {
document.body.removeChild(iframe);
}
}
Любые идеи о том, как получить событие, когда диалоговое окно печати iframe закрывается?
Для большего контекста, docUrl
- это строка URL-адреса PDF, которая находится в нашем собственном домене. Это нужно только для Google Chrome.