Подтвердить что ты не робот

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

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

EDIT:

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

EDIT:

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

4b9b3361

Ответ 2

Многие браузеры теперь поддерживают 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);
}

Подробнее: http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/

Ответ 3

Попробуйте маскировать собственный 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);
  }

}())

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

Ответ 4

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

Оба, использующие onafterprint и использующие серверное динамическое создание изображений script, скажут вам, что страница была напечатана, даже когда посетитель просто отправился в режим предварительного просмотра, а затем отменил.

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

Ответ 5

(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;}());

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