Выполнение функции до того, как страница попадет в window.print()

У меня есть страница, которая вызывает window.print(); внизу страницы. У меня нет возможности получить доступ к коду вокруг window.print(); Он генерируется сервером, и я не могу его коснуться. В основном из-за IE мне нужно выполнить немного javascript до того, как появится диалоговое окно печати, но после загрузки страницы. Я не могу этого сделать, потому что как только он попадет в window.print(); появится диалоговое окно печати. Мне все еще нужно печатать, но сначала мне нужно запустить myFunction(), затем я могу window.print();

<html><head></head><body></body><!--no access from here--><script>window.print();</script></html>

5 ответов

Решение

Вы должны быть в состоянии переопределить это так...

var _print = window.print;
window.print = function() {
  alert("Hi!");
  // do stuff
  _print();
}

"В основном из-за IE мне нужно..."

Если вам нужна только поддержка IE, смотрите событие onbeforeprint.

window.onbeforeprint = function () {
    // some code    
}

Преимущество здесь в том, что код не будет работать в браузерах, которые не поддерживают onbeforeprint, что практически во всех браузерах, кроме IE.

Эта функция работает для всех браузеров, включая IE, независимо от того, как вызывается печать:

/**
* Adds listeners for crossbrowser print callback
* @param callback - callback function
*/
function onPrint(callback) {
    window.matchMedia('print').addListener(query => query.matches ? callback() : null)
    window.addEventListener('beforeprint', () => callback())
}

onPrint(() => console.log('printing!'))

Имейте в виду, что это может запустить функцию обратного вызова дважды, в зависимости от браузера. Это можно обойти с помощью временного флага.

Попробуйте поставить другой <script> пометьте перед тем, к которому у вас нет доступа, например:

<html><head></head><body></body><script>alert('Hello There !');</script><script>window.print();</script></html>

Более чистый и современный способ справиться с этим:

      window.addEventListener('beforeprint', () => {
    // before print, do something
});
Другие вопросы по тегам