printDiv (divId) : Herhangi bir div öğesini herhangi bir sayfaya yazdırmak için genelleştirilmiş bir çözüm.
Benzer bir sorunum vardı, ancak (a) tüm sayfayı yazdırabilmek veya (b) belirli alanlardan herhangi birini basmak istedim. Benim çözümüm, yukarıdakilerin çoğu sayesinde, yazdırılacak herhangi bir div nesnesini belirtmenize izin verir.
Bu çözümün anahtarı, istenen div (ve içeriği) yazdırılacak şekilde yazdırma ortamı stil sayfasına uygun bir kural eklemektir.
İlk olarak, her şeyi bastırmak için gerekli print css dosyasını oluşturun (ancak yazdırmak istediğiniz öğeye izin vermek için belirli bir kural olmadan).
<style type="text/css" media="print">
body {visibility:hidden; }
.noprintarea {visibility:hidden; display:none}
.noprintcontent { visibility:hidden; }
.print { visibility:visible; display:block; }
</style>
Yeni sınıf kuralları eklediğimi unutmayın:
- noprintarea , bölgenizdeki hem içerik hem de blok içindeki öğelerin yazdırılmasını engellemenizi sağlar.
- noprintcontent , bölgenizdeki öğelerin yazdırılmasını engellemenize olanak tanır - içerik gizlenir, ancak ayrılan alan boş bırakılır.
- print , basılı sayfada gösterilen ancak ekran sayfasında görünmeyen öğelere sahip olmanızı sağlar. Bunlar normalde ekran stili için "display: none" olur.
Ardından üç JavaScript işlevi ekleyin. İlki yalnızca yazdırma ortamı stil sayfasını açar ve kapatır.
function disableSheet(thisSheet,setDisabled)
{ document.styleSheets[thisSheet].disabled=setDisabled; }
İkincisi gerçek işi yapar ve üçüncüsü daha sonra temizler. İkinci (printDiv) yazdırma ortamı stil sayfasını etkinleştirir, ardından istenen div'in yazdırmasına izin vermek için yeni bir kural ekler, baskıyı düzenler ve son temizlik işleminden önce bir gecikme ekler (aksi takdirde stiller aslında baskıdan önce sıfırlanabilir yapılır.)
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);
}
Son işlevler eklenen kuralı siler ve tüm sayfanın yazdırılabilmesi için baskı stilini tekrar devre dışı olarak ayarlar.
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);
}
Yapmanız gereken tek şey, yazdırma işleminin başlangıçta devre dışı bırakılması ve böylece tüm sayfanın yazdırılmasına izin vermek için yükleme işleminize bir satır eklemektir.
<body onLoad='disableSheet(0,true)'>
Ardından belgenizdeki herhangi bir yerden bir div yazdırabilirsiniz. Sadece bir düğmeden veya başka bir şeyden printDiv ("canlı") yayınlayın.
Bu yaklaşım için büyük bir artı, seçilen içeriğin bir sayfadan yazdırılması için genel bir çözüm sağlar. Ayrıca, içeren div de dahil olmak üzere yazdırılan öğeler için mevcut stillerin kullanılmasına izin verir.
NOT: Benim uygulamada, bu ilk stil sayfası olmalıdır. Sayfa sırasını daha sonra yapmanız gerekirse, sayfa referanslarını (0) uygun sayfa numarasına değiştirin.