onbeforeprint () и onafterprint () эквивалент для не IE-браузеров

17

Я хочу отправить некоторую информацию обратно в мою базу данных, когда пользователь печатает определенную веб-страницу. Я могу сделать это в IE с onbeforeprint() и onafterprint() , но я бы хотел, чтобы обозреватель агностически делал то же самое. Не волнует, какую комбинацию технологий я должен использовать (PHP, MySQL, JavaScript, HTML), пока это делается. Любые идеи?

EDIT:

Все еще есть некоторые проблемы с этим. Я попытался помещать свою функцию в свой файл Print.css в качестве изображения, но я как-то испортил его. Затем я попробовал просто добавить слушателя событий, но я не могу заставить это работать совершенно правильно. Если кто-то может предоставить более подробную информацию о том, как я могу вызвать функцию прямо перед печатью в ЛЮБОЙ браузер, я был бы признателен.

EDIT:

Сейчас я отказываюсь от этого, я решил с другим способом сделать то, что хочу. Я с нетерпением жду того дня, когда FireFox поддерживает onbeforeprint () и onafterprint ().

    
задан ubiquibacon 27.07.2010 в 01:44
источник

5 ответов

6

Я не уверен, что другие браузеры позволят вам . Конечно, вы можете указать изображение где-нибудь в таблице стилей печати, которая, вероятно, будет вызвана только печатью, для onbeforeprint

    
ответ дан Wrikken 27.07.2010 в 01:52
источник
  • Вы предлагаете что-то вроде этого? siteexperts.com/forums/viewConverse.asp?d_id=19568 –  ubiquibacon 27.07.2010 в 02:17
  • Не знаю, будет ли это работать. Я бы предложил называть серверный сценарий как источник изображения, который действительно возвращает изображение, и просто делает нужный материал (зарегистрировать действие печати, возможно, установить переменную сеанса, которую другие js на странице могут получить / опросить и т. Д.). –  Wrikken 27.07.2010 в 11:50
  • onbeforeprint поддерживается Firefox с версии 6, см. developer.mozilla.org/en/DOM/window.onbeforeprint –  Julien Kronegg 18.06.2012 в 10:36
30

Многие браузеры теперь поддерживают window.matchMedia . Этот API позволяет обнаруживать, когда запросы мультимедийных сообщений CSS вступают в силу (например, вращение экрана или печать документа). Для кросс-браузерного подхода объедините window.matchMedia с window.onbeforeprint / window.onafterprint .

Ниже приведено несколько вызовов beforePrint() и afterPrint() (например, Chrome запускает прослушиватель при каждом восстановлении предварительного просмотра печати ). Это может быть или не быть желательным в зависимости от конкретной обработки, которую вы делаете в ответ на печать.

if ('matchMedia' in window) {
    // Chrome, Firefox, and IE 10 support mediaMatch listeners
    window.matchMedia('print').addListener(function(media) {
        if (media.matches) {
            beforePrint();
        } else {
            // Fires immediately, so wait for the first mouse movement
            $(document).one('mouseover', afterPrint);
        }
    });
} else {
    // IE and Firefox fire before/after events
    $(window).on('beforeprint', beforePrint);
    $(window).on('afterprint', afterPrint);
}

Подробнее: Ссылка

    
ответ дан user113215 27.03.2013 в 16:27
источник
  • Стоит отметить, что Chrome, похоже, дважды запускает событие печати. –  jlarson 29.08.2013 в 20:01
  • ... фактически четыре раза - один раз с media.matches = true, затем media.matches = false, затем media.matches = true, а затем media.matches = false. –  jlarson 29.08.2013 в 20:47
  • Это не работает, когда я использую «Печать с использованием системного диалога» в Chrome. Окно закрывается, но печать терпит неудачу. Просто сообщать. :) –  Augiwan 15.02.2014 в 18:51
  • Не работайте для обновления HTML / класса перед печатью. Только ОК для печати (с Chromium 38). Смотрите эту скрипку: jsfiddle.net/8a71xxc2. Хорошо с FF (но только с функцией onbeforeprint), а не с Chrome –  Denis Chenu 02.12.2014 в 17:24
4

Попробуйте маскировать собственный window.print() со своим собственным ...

// hide our vars from the global scope
(function(){

  // make a copy of the native window.print
  var _print = this.print;

  // create a new window.print
  this.print = function () {
    // if 'onbeforeprint' exists, call it.
    if (this.onbeforeprint) onbeforeprint(this); 
    // call the original 'window.print'.
    _print(); 
    // if 'onafterprint' exists, call it.
    if (this.onafterprint) onafterprint(this);
  }

}())

Обновлено: комментарии.

    
ответ дан Dagg Nabbit 27.07.2010 в 01:55
источник
  • Спасибо @no, но мне тяжело следовать вашему коду. Вы говорите, что это замаскирует собственную функцию печати в любом браузере? Это вызывает у меня еще один вопрос: могу ли я просто создать функцию JavaScript, которая проверила событие «КАЖДОЕ окно», а затем выполнить функцию, которую я хочу выполнить, перед печатью, когда window.print == true? –  ubiquibacon 27.07.2010 в 02:20
  • @typoknig: он будет; из-за этого вы можете выбрать разные имена для onbeforeprint и onafterprint. Я предполагаю, что вы хотите поймать вызовы window.print из других сценариев, кроме ваших собственных. Что касается второй части вашего вопроса, я думаю, что это сработает, но это звучит как излишество ... –  Dagg Nabbit 27.07.2010 в 02:29
  • @typoknig: я добавил комментарии кодов к моему ответу, должен помочь объяснить, что происходит. –  Dagg Nabbit 27.07.2010 в 02:32
  • На моей странице я не предоставляю пользователю кнопку печати, поэтому мне действительно нужно поймать, когда пользователь переходит к файлу> Печать в браузере, отличном от IE. Я немного поработаю с ним и посмотрю, смогу ли я заставить ваш код работать, если не тогда, я могу пойти «перехитрить» :) –  ubiquibacon 27.07.2010 в 02:32
  • Тогда это вам не поможет. Посмотрите еще раз на ответ Wrikken; вы можете поместить нужные данные в строку запроса, а затем добавить правило печати css, которое загружает изображение через серверный скрипт, который хранит данные из строки запроса перед ответом с изображением. –  Dagg Nabbit 27.07.2010 в 03:05
Показать остальные комментарии
0

Я думаю, что это просто невозможно. Или, по крайней мере, не с какой-либо технологией, которую я знаю, ни с какими-либо из ответов, приведенных ранее.

Как с использованием onafterprint, так и с использованием сценария создания динамического образа serveride скажут вам, что страница была напечатана, даже когда посетитель просто отправился в режим предварительного просмотра, а затем отменил.

Однако я хотел бы узнать, как получить правильную информацию, чтобы я мог sure напечатать эту страницу.

    
ответ дан userfuser 22.08.2012 в 23:22
источник
0
(function() {
var beforePrint = function() {
    if($('.modal').hasClass('in')){
        $('body').removeClass('modal-open');
    }
};
var afterPrint = function() {
    if($('.modal').hasClass('in')){
        $('body').addClass('modal-open');
    }
};

if (window.matchMedia) {
    var mediaQueryList = window.matchMedia('print');
    mediaQueryList.addListener(function(mql) {
        if (mql.matches) {
            beforePrint();
        } else {
            afterPrint();
        }
    });
}
window.onbeforeprint = beforePrint;
window.onafterprint = afterPrint;}());

Этот код работает во всех браузерах для обнаружения событий печати. ​​

    
ответ дан Dayachand Patel 14.12.2016 в 10:18
источник