2009-08-05 29 views
41

Czy jest możliwe aby wykryć, kiedy użytkownik drukuje coś ze swojej przeglądarki?Wykrywanie druku przeglądarka wydarzenie

Aby komplikować sprawę, jeśli prezentujemy dokument PDF w nowym oknie, można wykryć drukowanie tego dokumentu (zakładając, że użytkownik wydrukuje go z okna przeglądarki)?

Najbliżej byłem w stanie znaleźć się jeśli wdrożymy funkcjonalności zwyczaj drukowania (coś jak this) i śledzić kiedy ten jest wywoływany

Jestem zainteresowany przede wszystkim rozwiązanie, które działa na Internet Explorer (6 lub później)

Odpowiedz

96

Teraz można wykryć żądanie drukowania w IE 5+, 6+ Firefox, Chrome 9+, Safari 5+ stosując następujące techniki:

(function() { 
    var beforePrint = function() { 
     console.log('Functionality to run before printing.'); 
    }; 
    var afterPrint = function() { 
     console.log('Functionality to run after printing'); 
    }; 

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

    window.onbeforeprint = beforePrint; 
    window.onafterprint = afterPrint; 
}()); 

wchodzę w to, co bardziej szczegółowo to robi i co może być używany w http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/.

+1

Jesteś super. Przez kilka dni szukałem obsługi "Chrome/Safari" usługi onbeforeprint. Powinienem był wiedzieć, że lepiej nie opuszczać ocieplenia SO. – Pat

+2

+1, bardzo miło, planuję wkrótce plagiatować tę odpowiedź. –

+8

To już nie działa w przeglądarce Chrome 38 w systemie Windows. 'beforePrint' nigdy nie uruchamia się. http://jsfiddle.net/o5oosa9o/ (Prawym przyciskiem myszy kliknij element iframe wyników i wybierz "Drukuj ...") – Michael

3

Dla Exploder Internetu istnieją zdarzenia window.onbeforeprint i window.onafterprint, ale nie działają one z żadną inną przeglądarką iw rezultacie są zwykle bezużyteczne.

Wydają się działać dokładnie tak samo z jakiegoś powodu, zarówno wykonywanie ich obsługi zdarzeń, zanim otworzy się okno drukowania.

Jednak w przypadku, gdy chcesz to i tak mimo tych zastrzeżeń, oto przykład:

window.onbeforeprint = function() { 
    alert("Printing shall commence!"); 
} 
2

Jeśli jest to tylko do celów śledzenia, być może można ustawić adres URL tła w CSS na stronie serwera (.aspx, .php, itp.), A następnie zrobić coś na serwerze?

This guy claims it works.

To nie jest tak versitile jako roztwór TJ, ale może to być mniej buggy (patrz TJS blogu za kwestie on znaleziony), gdy tylko śledzenie jest potrzebne.

+0

Myślę, że było kilka problemów z moim podejściem, takich jak podgląd wydruku itp., Ale dla mniej niż krytycznego logowania, działało OK dla mnie. –