printDiv (divId) : Uogólnione rozwiązanie do drukowania dowolnego div na dowolnej stronie.
Miałem podobny problem, ale chciałem (a) móc wydrukować całą stronę lub (b) wydrukować jeden z kilku określonych obszarów. Moje rozwiązanie, dzięki dużej części powyższych, pozwala określić dowolny obiekt div do wydrukowania.
Kluczem do tego rozwiązania jest dodanie odpowiedniej reguły do arkusza stylów nośnika wydruku, aby wydrukować żądany plik div (i jego zawartość).
Najpierw utwórz potrzebny css drukowania, aby wszystko ukryć (ale bez określonej reguły zezwalającej na element, który chcesz wydrukować).
<style type="text/css" media="print">
body {visibility:hidden; }
.noprintarea {visibility:hidden; display:none}
.noprintcontent { visibility:hidden; }
.print { visibility:visible; display:block; }
</style>
Pamiętaj, że dodałem nowe reguły klasowe:
- noprintarea pozwala ci zablokować drukowanie elementów w twoim div - zarówno zawartość, jak i blok.
- noprintcontent pozwala ci pominąć drukowanie elementów w twoim div - zawartość jest pomijana, ale przydzielony obszar pozostaje pusty.
- print pozwala mieć elementy, które pojawiają się w wersji drukowanej, ale nie na stronie ekranu. Zwykle będą miały „display: none” dla stylu ekranu.
Następnie wstaw trzy funkcje JavaScript. Pierwszy tylko włącza i wyłącza arkusz stylów nośnika wydruku.
function disableSheet(thisSheet,setDisabled)
{ document.styleSheets[thisSheet].disabled=setDisabled; }
Drugi wykonuje prawdziwą pracę, a trzeci czyści później. Drugi (printDiv) aktywuje arkusz stylów nośnika wydruku, a następnie dołącza nową regułę, aby umożliwić wydrukowanie żądanego pliku div, wydaje wydruk, a następnie dodaje opóźnienie przed ostatecznym porządkiem (w przeciwnym razie style można zresetować przed wydrukiem gotowy.)
function printDiv(divId)
{
// Enable the print CSS: (this temporarily disables being able to print the whole page)
disableSheet(0,false);
// Get the print style sheet and add a new rule for this div
var sheetObj=document.styleSheets[0];
var showDivCSS="visibility:visible;display:block;position:absolute;top:30px;left:30px;";
if (sheetObj.rules) { sheetObj.addRule("#"+divId,showDivCSS); }
else { sheetObj.insertRule("#"+divId+"{"+showDivCSS+"}",sheetObj.cssRules.length); }
print();
// need a brief delay or the whole page will print
setTimeout("printDivRestore()",100);
}
Ostatnie funkcje usuwają dodaną regułę i ponownie ustawiają styl drukowania na wyłączony, aby można było wydrukować całą stronę.
function printDivRestore()
{
// remove the div-specific rule
var sheetObj=document.styleSheets[0];
if (sheetObj.rules) { sheetObj.removeRule(sheetObj.rules.length-1); }
else { sheetObj.deleteRule(sheetObj.cssRules.length-1); }
// and re-enable whole page printing
disableSheet(0,true);
}
Jedyne, co należy zrobić, to dodać jeden wiersz do przetwarzania obciążenia, aby styl drukowania był początkowo wyłączony, umożliwiając w ten sposób drukowanie całej strony.
<body onLoad='disableSheet(0,true)'>
Następnie z dowolnego miejsca w dokumencie możesz wydrukować plik div. Wystarczy wydać printDiv („thedivid”) z przycisku lub cokolwiek innego.
Duży plus za to podejście stanowi ogólne rozwiązanie do drukowania wybranej zawartości z poziomu strony. Pozwala także na użycie istniejących stylów dla drukowanych elementów - w tym zawierającego div.
UWAGA: W mojej implementacji musi to być pierwszy arkusz stylów. Zmień odniesienia do arkusza (0) na odpowiedni numer arkusza, jeśli chcesz zrobić to później w kolejności arkuszy.