Safari, javascript: дождаться окна подтверждения печати - PullRequest
0 голосов
/ 21 мая 2018

У меня есть такой код:

hideStuff();
window.print();
showStuff();

Итак, hideStuff() скрывает определенные элементы на странице, чтобы они не печатались, в то время как showStuff() восстанавливает эти скрытые элементы после закрытия диалогового окна печати.,

Это работает в Safari первый раз, когда я нажимаю кнопку печати, но если я затем отменяю диалог печати, вернитесь на страницу и снова нажмите кнопку печати , Safari появляется сообщение «Эта веб-страница пытается распечатать. Вы хотите распечатать эту веб-страницу?»и затем, если я продолжу, в результате предварительного просмотра печати будут отображены все элементы страницы, даже те, которые должны быть скрыты.

Проблема заключается в том, что диалоговое окно «Вы уверены» задерживает открытиеwindow.print(), но он позволяет продолжить работу JavaScript. То есть showStuff() запускается немедленно, а не после закрытия диалогового окна печати.

Что я могу сделать, чтобы остановить выполнение, пока открыто окно "Вы уверены"?

Спасибо!

1 Ответ

0 голосов
/ 11 марта 2019

Я столкнулся с той же проблемой и задумался - какое событие может сработать, когда пользователь нажмет Отмена в этом диалоговом окне подтверждения?
И оказалось, что наше событие супергероя мало onfocus.Он запускается всякий раз, когда пользователь нажимает кнопку Отмена или нажимает Esc на клавиатуре.

Таким образом, решение, основанное на этом выводе, может выглядеть примерно так:

function safariPrint() {
  // Safari 12, macOS
  if (!window.onafterprint) {
    const onAfterPrint = mql => {
      if (!mql.matches) {
        showStuff();

        // printing is finished => unsubscribe to avoid leaks
        if (mediaQueryList.removeEventListener) {
          mediaQueryList.removeEventListener('change', onAfterPrint);
        } else {
          mediaQueryList.removeListener(onAfterPrint);
        }
      }
      window.onfocus = null;
    };

    // a tiny polyfill for a plain onafterprint
    // to handle standard window.print() dialog events
    const mediaQueryList = window.matchMedia('print');
    if (mediaQueryList.addEventListener) {
      mediaQueryList.addEventListener('change', onAfterPrint);
    } else {
      mediaQueryList.addListener(onAfterPrint);
    }

    // if a user cancels printing in Safari's print confirmation dialog
    // then we will trigger a cleanup
    window.focus();
    window.onfocus = () => {
      onAfterPrint(mediaQueryList);
    };
  }

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