2012-06-21 2 views
22

Czy jest możliwe wywołanie zdarzenia javascript, gdy użytkownik drukuje stronę? Chciałbym usunąć zależność od biblioteki javascript, gdy użytkownik zdecyduje się wydrukować stronę, ponieważ biblioteka jest świetny dla ekranu, ale nie dla drukowania.Jak wyzwolić javascript na wydarzenie drukowania?

Każdy pomysł, jak to osiągnąć?

+1

Co dokładnie próbujesz osiągnąć?Co masz na myśli mówiąc "biblioteka jest świetna do wyświetlania na ekranie, ale nie do druku"? –

+1

Co ma wspólnego biblioteka JavaScript z drukowaniem? Przeglądarka nie wywołuje żadnych skryptów stron podczas drukowania. – Pointy

+0

użyj funkcji window.onprint, window.onafterprint, window.onbeforeprint –

Odpowiedz

24

Dla każdego, potykając po tej odpowiedzi od Google, pozwól mi spróbować wyjaśnić:

Jak zauważył Ajay, istnieją dwa zdarzenia, które są zwalniane do drukowania, ale nie są one dobrze obsługiwane; o ile czytałem, są one obsługiwane tylko w przeglądarkach Internet Explorer i Firefox (6+). Te zdarzenia to window.onbeforeprint i window.onafterprint, które (jak można się spodziewać) będą uruchamiane przed i po zadaniu drukowania.

Jednak, jak wskazano w linku Joego (https://stackoverflow.com/a/9920784/578667), nie jest to dokładnie to, w jaki sposób jest zaimplementowany we wszystkich przypadkach. W większości przypadków oba zdarzenia są uruchamiane przed oknem dialogowym; w innych, wykonanie skryptu może zostać zatrzymane w oknie dialogowym drukowania, więc oba zdarzenia mogą wystrzelić w tym samym czasie (po tym, jak okno dialogowe zostanie zakończone).

Aby uzyskać więcej informacji i wsparcia (przeglądarki) dla tych dwóch zdarzeń:

https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeprint

https://developer.mozilla.org/en-US/docs/DOM/window.onafterprint

Krótka odpowiedź: jeśli masz nadzieję, że zakłóca przepływu drukującej, nie należy . Jeśli masz nadzieję na wyzwolenie kodu po wydrukowaniu, nie będzie działać tak, jak chcesz; oczekuj słabej obsługi przeglądarki i spróbuj znieść degradację.

+2

Dodatkowo, jeśli próbujesz zmienić układ lub wyświetlacz do drukowania, powinieneś to zrobić z arkuszem stylów drukowania (lub '' printem drukowania 'w twoim css), a nie JavaScript –

+0

@TomPietrosanti Całkowicie się zgadzam, ale są pewne niektóre rzeczy, których nie można zrobić przy użyciu CSS (np. zmienić kolejność elementów). Zobacz [moje pytanie] (http://stackoverflow.com/questions/25030208/dom-manipulation-on-print-only). – chharvey

+0

Możesz zmienić kolejność (do pewnego stopnia), jeśli możesz używać Flexbox, ale poza tym to prawda. Jeśli nie potrzebujesz JS, uniknęłbym go - może to prowadzić do bardzo dziwnych błędów. –

0

jeśli masz scenariusz, w którym u chcą coś zrobić, zanim pojawi się okno dialogowe drukowania lub po prostu dokument zostanie wysłany do użytku kolejkę drukarki można użyć poniższej Wydarzenia window.onafterprint, window.onbeforeprint

+0

Próbowałem w Chome, ale to nie działa. Chociaż może w IE, ale IE nie jest dla mnie dobre tutaj. Dzięki. http://stackoverflow.com/a/9920784/578667 – Joe

+1

Przy odrobinie hackerydoo, możesz go uruchomić także w przeglądarkach opartych na webkitach: http://tjvantoll.com/2012/06/15/detecting-print- requests-with-javascript/Jedynym pominiętym jest Opera, ale przedsiębiorcza osoba mogłaby prawdopodobnie również wymyślić polyfill/hack. –

9

Można to zrobić poprzez nadpisanie, np. window.onbeforeprint.

Korzystając z Chrome, stwierdziłem, że działa również bardziej tajemniczy window.matchMedia("print").addListener(function() {alert("Print Dialog open.")}).

Ta dyskusyjna funkcja może być używana w celu powstrzymania użytkowników przed wydrukowaniem strony.

Napotkałem to po raz pierwszy na Scribd. Tam, jeśli otworzysz okno dialogowe drukowania za pomocą polecenia menu, zawartość strony będzie wyszarzona i pojawi się komunikat ostrzegawczy z ostrzeżeniem, dlaczego nie można wydrukować strony. (Uwaga dla pełnej analizy: na tej stronie kontrolka-p jest również nadpisywana, więc nie możesz jej użyć do otwarcia okna dialogowego drukowania.Ale jest też @media CSS dla wyjścia drukarki, który ukrywa zawartość - wszystko przetestowane w Firefoksie).

+0

W Chrome Twoje "tajemnicze" rozwiązanie działa, ale dzieje się to cztery razy. – chharvey

+2

Wyobrażam sobie, że jeśli masz wiele stylów drukowania lub drukujesz arkusze stylów, wystrzeliłby tyle, ile masz. Gdy uruchomię ten kod bez stylów drukowania, uruchomi się on raz. –

0

Dla każdego, kto tu przyjeżdża szukając opcji przy użyciu Bootstrapa, jak byłem, użyłem następującego kodu, aby osiągnąć ten po kliknięciu przycisku drukowania. Ten nie praca po naciśnięciu klawisza CTRL + P.

$("#print_page").click(function(){ 
$("#print_section").addClass('visible-print-block'); 
window.print(); 
$("#print_section").removeClass('visible-print-block');}) 

Trzeba dodać ukrytych drukiem do niczego nie chcesz drukowanej, a następnie dodać identyfikator (lub klasy, jeśli masz więcej niż jedna sekcja) strony print_section do bitu, który chcesz wydrukować! Trochę hacky, ale działa!

+0

Możesz także [zastąpić CTRL + P] (https://stackoverflow.com/a/3680946/479156), aby wywołać ten sam kod/funkcję, ale to wciąż nie jest 100% dowodem, ponieważ istnieje więcej sposobów drukowania. – Ivar