Я хочу отправить некоторую информацию обратно в мою базу данных, когда пользователь печатает определенную веб-страницу. Я могу сделать это в IE с onbeforeprint()
и onafterprint()
но я бы хотел, чтобы обозреватель агностически делал то же самое. Не волнует, какую комбинацию технологий я должен использовать (PHP, MySQL, JavaScript, HTML), пока это делается. Есть идеи?
РЕДАКТИРОВАТЬ:
Все еще есть проблемы с этим. Я попытался поставить свою функцию в свой Print.css
как образ, но я как-то испортил его. Затем я попробовал просто добавить слушателя событий, но я не могу заставить это работать совершенно правильно. Если кто-то может предоставить более подробную информацию о том, как я могу назвать функцию прямо перед печатью в ЛЮБОЙ браузер, я был бы признателен.
РЕДАКТИРОВАТЬ:
На данный момент я отказываюсь от этого, я поселился с другим способом делать то, что хочу. Я с нетерпением жду того дня, когда FireFox поддерживает onbeforeprint () и onafterprint ().
Я не уверен, что другие браузеры позволят вам это сделать . Конечно, вы можете указать изображение где-нибудь в таблице стилей печати, которая, вероятно, будет вызвана только печатью, для onbeforeprint
Многие браузеры теперь поддерживают 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/
Попробуйте маскировать родной 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); } }())
Обновлено: комментарии.
Я думаю, что это просто невозможно. Или, по крайней мере, не с какой-либо технологией, которую я знаю, ни с каким-либо из ответов, приведенных ранее.
Как с использованием onafterprint, так и с использованием сценария с динамическим построением сервера serveride скажут вам, что страница была напечатана, даже когда посетитель просто отправился в режим предварительного просмотра, а затем был отменен.
Однако я хотел бы узнать, как получить правильную информацию, чтобы я мог быть уверен, что страница была напечатана.
(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;}());
Этот код работает во всех браузерах для обнаружения событий печати.