@r_g_b_a

Как сделать передачу данных на страницу для печати?

Здравствуйте.
Есть калькулятор, который рассчитывает порядка 15 значений. Нужно их красиво оформить в таблице и отдать пользователю на печать. Моя идея состоит в том, чтобы подготовить для этого отдельную html-страницу, и передавать на нее данные со страницы калькулятора. Как это лучше сделать? Мои варианты:
1) localStorage. Из минусов: не будет работать в приватном окне сафари, либо будет пустая страница после очистки хранилища
2) Передача параметров в url. Примерная длина строки будет 400 символов. В одной из статей говориться, что в браузерах довольно большие лимиты, от 2000 в IE, до безлимита в FF, Safari, Chrome. Насколько это достоверная информация? Как-то можно закодировать строку, существенно уменьшив ее длину?
3) windows.open(). Если вызывать через onclick, проблем с блокировкой окна быть не должно?
В силу отсутствия опыта в подобных задачах нужен совет, как лучше это реализовать. Желательно без серверных решений.
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
function openWindowAndPrint(context, title = 'Документ') {
  const win = window.open();
  win.document.write(context);
  win.document.title = title;
  win.focus(); // Required for IE

  ensureImagesLoaded(win.document).then(() => win.print());
  win.onafterprint = () => win.close();

  return win;
}

function ensureImagesLoaded(document, waitTime = 7000) {
  const images = document.querySelectorAll('img');
  const loadedList = Array.from(images).map(imageLoadToPromise);
  const timeout = new Promise(resolve => setTimeout(resolve, waitTime));

  return Promise.race([timeout, Promise.all(loadedList)]);
}

function imageLoadToPromise(img) {
  return new Promise(resolve => img.addEventListener('load', resolve));
}


Еще можно открывать для печати специально подготовленную страницу, на который скрипт слушает событие message.
И отправлять примерно так
win.onload = () => win.postMessage({
      method: 'sendFileData',
      payload,
    }, '*');


windows.open(). Если вызывать через onclick, проблем с блокировкой окна быть не должно?

Обычно браузеры не блокирует попапы, вызванные действиями пользователя.

p.s. Если кто знает способ попроще узнать момент, когда загрузились все картинки - welcome
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы