printDiv (divId) : узагальнене рішення для друку будь-якого 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 дозволяє придушити друк елементів у вашому розділі - вміст пригнічується, але виділена область залишається порожньою.
- друк дозволяє мати елементи, які відображаються у друкованій версії, але не на екранній сторінці. Для стилю екрана вони зазвичай матимуть "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);
}
Єдине, що потрібно зробити - це додати один рядок до вашої обробки завантаження, щоб стиль друку спочатку був відключений, тим самим дозволяючи друкувати цілі сторінки.
<body onLoad='disableSheet(0,true)'>
Потім з будь-якого місця документа ви можете надрукувати div. Просто видайте printDiv ("thedivid") з кнопки чи будь-чого іншого.
Великим плюсом для цього підходу є загальне рішення для друку вибраного вмісту всередині сторінки. Це також дозволяє використовувати існуючі стилі для елементів, які друкуються, в тому числі містять div.
ПРИМІТКА. У моїй реалізації це повинен бути перший аркуш стилів. Змініть посилання на аркуші (0) на відповідний номер аркуша, якщо вам потрібно зробити це пізніше у послідовності аркушів.