Как определить window.print () fini sh для iframe? - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь получить событие, когда 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...