printDiv (divId) : ทางออกทั่วไปเพื่อพิมพ์ div ใด ๆ ในหน้าใด ๆ
ฉันมีปัญหาที่คล้ายกัน แต่ฉันต้องการ (a) สามารถพิมพ์ทั้งหน้าหรือ (b) พิมพ์หนึ่งในหลาย ๆ พื้นที่ที่เฉพาะเจาะจง วิธีการแก้ปัญหาของฉันขอบคุณมากข้างต้นช่วยให้คุณระบุวัตถุ div ใด ๆ ที่จะพิมพ์
กุญแจสำคัญสำหรับการแก้ปัญหานี้คือการเพิ่มกฎที่เหมาะสมลงในสไตล์ชีทสื่อสิ่งพิมพ์เพื่อให้ div (และเนื้อหา) ที่ร้องขอถูกพิมพ์
ก่อนอื่นให้สร้าง css การพิมพ์ที่จำเป็นเพื่อระงับทุกอย่าง (แต่ไม่มีกฎเฉพาะเพื่ออนุญาตองค์ประกอบที่คุณต้องการพิมพ์)
<style type="text/css" media="print">
body {visibility:hidden; }
.noprintarea {visibility:hidden; display:none}
.noprintcontent { visibility:hidden; }
.print { visibility:visible; display:block; }
</style>
โปรดทราบว่าฉันได้เพิ่มกฎระดับใหม่:
- noprintareaช่วยให้คุณระงับการพิมพ์องค์ประกอบภายในแผนกของคุณทั้งเนื้อหาและบล็อก
- noprintcontentช่วยให้คุณสามารถระงับการพิมพ์องค์ประกอบภายใน div ของคุณเนื้อหาถูกระงับ แต่และพื้นที่ที่ถูกจัดสรรว่างเปล่า
- การพิมพ์ช่วยให้คุณมีรายการที่แสดงในเวอร์ชันที่พิมพ์ แต่ไม่ปรากฏบนหน้าจอ โดยปกติจะมี "display: none" สำหรับรูปแบบหน้าจอ
จากนั้นแทรกฟังก์ชัน JavaScript สามรายการ สิ่งแรกที่ทำคือเปิดและปิดสไตล์ชีตสื่อสิ่งพิมพ์
function disableSheet(thisSheet,setDisabled)
{ document.styleSheets[thisSheet].disabled=setDisabled; }
ที่สองทำงานจริงและที่สามทำความสะอาดหลังจากนั้น ที่สอง (printDiv) เปิดใช้งานสไตล์ชีตสื่อสิ่งพิมพ์จากนั้นผนวกกฎใหม่เพื่อให้ div ที่ต้องการพิมพ์ออกพิมพ์และเพิ่มความล่าช้าก่อนการดูแลขั้นสุดท้าย (มิฉะนั้นสามารถรีเซ็ตสไตล์ก่อนที่จะพิมพ์จริง ๆ ทำ.)
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);
}
ฟังก์ชั่นสุดท้ายลบกฎที่เพิ่มและตั้งค่าสไตล์การพิมพ์อีกครั้งเพื่อปิดการใช้งานเพื่อให้ทั้งหน้าสามารถพิมพ์ได้
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);
}
สิ่งเดียวที่ต้องทำคือการเพิ่มหนึ่งบรรทัดในการประมวลผล onload ของคุณเพื่อให้รูปแบบการพิมพ์ถูกปิดใช้งานในขั้นต้นซึ่งจะช่วยให้สามารถพิมพ์ได้ทั้งหน้า
<body onLoad='disableSheet(0,true)'>
จากนั้นในเอกสารของคุณคุณสามารถพิมพ์ div เพียงแค่พิมพ์ printDiv ("thedivid") จากปุ่มหรืออะไรก็ตาม
ข้อดีที่ยิ่งใหญ่สำหรับวิธีนี้คือโซลูชันทั่วไปในการพิมพ์เนื้อหาที่เลือกจากภายในหน้า นอกจากนี้ยังอนุญาตให้ใช้สไตล์ที่มีอยู่สำหรับองค์ประกอบที่พิมพ์ - รวมถึง div ที่มี
หมายเหตุ: ในการใช้งานของฉันนี้จะต้องเป็นสไตล์ชีตแรก เปลี่ยนการอ้างอิงชีต (0) เป็นหมายเลขชีตที่เหมาะสมหากคุณต้องการใช้ภายหลังในลำดับชีต