Как напечатать только выбранный элемент HTML?
Я пытаюсь реализовать функцию печати в HTML. Я знаю, что могу распечатать всю страницу с window.print()
, но как мне распечатать только определенный элемент страницы? Например, определенный <DIV>Some text to print</DIV>
,
18 ответов
Вы можете использовать специальную таблицу стилей CSS для печати и скрыть все, кроме того, что вы хотите напечатать.
<div class="no-print">I won't print</div><div class="something-else">I will!</div>
Просто no-print
класс будет скрыт, но все с классом печати покажет.
<style type="text/css" media="print">
.no-print { display: none; }
</style>
Если вы знакомы с jQuery, вы можете использовать плагин jQuery Print Element следующим образом:
$('SelectorToPrint').printElement();
Создано что-то общее для использования на любом элементе HTML
HTMLElement.prototype.printMe = printMe;
function printMe(query){
var myframe = document.createElement('IFRAME');
myframe.domain = document.domain;
myframe.style.position = "absolute";
myframe.style.top = "-10000px";
document.body.appendChild(myframe);
myframe.contentDocument.write(this.innerHTML) ;
setTimeout(function(){
myframe.focus();
myframe.contentWindow.print();
myframe.parentNode.removeChild(myframe) ;// remove frame
},3000); // wait for images to load inside iframe
window.focus();
}
Использование:
document.getElementById('xyz').printMe();
document.getElementsByClassName('xyz')[0].printMe();
Надеюсь это поможет
С уважением
Гаурав Хурана
Я нашел решение, у которого нет проблем, которые есть у других решений. Он копирует напечатанный элемент в тело и довольно элегантен и универсален:
CSS:
@media print {
body *:not(.printable, .printable *) {
// hide everything but printable elements and their children
display: none;
}
}
JS:
function printElement(e) {
let cloned = e.cloneNode(true);
document.body.appendChild(cloned);
cloned.classList.add("printable");
window.print();
document.body.removeChild(cloned);
}
Единственным ограничением является то, что элемент теряет стили, унаследованные от своих предыдущих родителей. Но он работает с произвольными элементами в структуре документа.
Лучше всего работает простой html и чистый javascript. Параметр this относится к текущему идентификатору, поэтому эта функция универсальна для всех идентификаторов с текстовым содержимым.
html body:
<div id="monitor" onclick="idElementPrint(this)">text i want to print</div>
чистый javascript:
//or: monitor.textContent = "click me to print textual content";
const idElementPrint = (idin) => {
let ifram = document.createElement("iframe");
ifram.style = "display:none";
document.body.appendChild(ifram);
pri = ifram.contentWindow;
pri.document.open();
pri.document.write(idin.textContent);
pri.document.close();
pri.focus();
pri.print();
}
Если вы используете JQuery, вы можете использовать клон, чтобы сделать следующее:
function printElement(e) {
var ifr = document.createElement('iframe');
ifr.style='height: 0px; width: 0px; position: absolute'
document.body.appendChild(ifr);
$(e).clone().appendTo(ifr.contentDocument.body);
ifr.contentWindow.print();
ifr.parentElement.removeChild(ifr);
}
и использовать так:printElement(document.getElementById('myElementToPrint'))
Если вы используете бутстрап, просто добавьте имя класса d-print-none к элементам, которые вы не хотите отображать в печати.
Если я вас хорошо понял, вы можете использовать CSS3 для печати выбранного HTML-элемента.
@media print {
body.print-element *:not(.print) {
display: none;
}
}
Обратите внимание, что вам просто нужен селектор. Это позволяет легко распечатать элемент или всю страницу с помощью классов CSS.
Здесь вы можете проверить рабочий пример: https://jsfiddle.net/gengns/d50m8ztu/
Добавить этот метод
function printDiv(divName) {
let specific_element = document.getElementById(divName).innerHTML;
let original_elements = document.body.innerHTML;
document.body.innerHTML = specific_element;
window.print();
document.body.innerHTML = original_elements;
}
Если вам нужно напечатать элемент HTML с помощью чистого JS, вы можете открыть окно, содержащее только элемент, который вы хотите распечатать (без какой-либо HTML-разметки).
Например, вы можете распечатать само изображение, не упаковывая его в какой-либо HTML, открыв это изображение в новом окне как файл.
Примечание: 'visible=none' на самом деле не делает окно невидимым, но позволяет открыть его как отдельное окно (не вкладку).
Событие afterprint позволяет нам закрыть окно при закрытии диалогового окна печати. event.target указывает на экземпляр открытого окна.
Примечание: afterprint ДОЛЖЕН быть назначен перед вызовом .print (), иначе он не будет вызываться.
let win = window.open('/absolute/image/path.jpg', '__blank', 'visible=none');
win.addEventListener('afterprint', event => event.target.close() );
win.print();
function printDomElement(element) {
element.classList.add("printCss");
let printId = "printSvgId";
let name = ".printCss";
let rules = "-webkit-print-color-adjust:exact;height:100%;width:100%;position:fixed;top:0;left:0;margin:0;";
var style = document.createElement('style');
style.id = printId;
style.media = "print";
document.getElementsByTagName('head')[0].appendChild(style);
if (!(style.sheet || {}).insertRule)(style.styleSheet || style.sheet).addRule(name, rules);
else style.sheet.insertRule(name + "{" + rules + "}", 0);
window.print();
setTimeout(() => {
element.classList.remove("printCss");
let elem = document.getElementById(printId);
if (elem) elem.remove();
}, 500);
}
Самый простой способ сделать это:
elem = document.getElementById('elem').outerHTML
orig = document.documentElement.innerHTML
document.write(elem)
print()
document.documentElement.innerHTML = orig
Эта реализация создаст и применит специальный временный стиль, который скроет все элементы на печатном носителе, кроме того, который мы хотим напечатать. После печати временный стиль удаляется, и ваш документ возвращается в исходное состояние.
Не стесняйтесь настраивать специальный стиль (например, размер бумаги, поля и т. д.) в соответствии с вашими потребностями.
/**
* @description Print the given element using browser built-in function
* @param {HTMLElement} element
*/
function printElement(element) {
if (!element) {
throw new Error(`Invalid print target element`);
}
const printWrapper = "print-wrapper";
const printElement = "print-element";
const css = `
body.${printWrapper} *:not(.${printElement}) {
visibility:hidden;
}
body.${printWrapper} .${printElement} {
width: 210mm;
height: 297mm;
left:0;
top:0;
position:fixed;
}
body.${printWrapper} .${printElement} * {
visibility:initial;
margin: 0;
}
`;
const head = document.getElementsByTagName("head")[0];
const style = document.createElement("style");
style.setAttribute("type", "text/css");
style.setAttribute("media", "print");
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
head.appendChild(style);
document.body.classList.add(printWrapper);
element.classList.add(printElement);
window.print();
document.body.classList.remove(printWrapper);
element.classList.remove(printElement);
head.removeChild(style);
}
Распечатать Html или Selected Html легко, используя Print.Js Добавить Print.Js Library
http://printjs.crabbly.com/
<form method="post" action="#" id="printJS-form">
...
</form>
<button type="button" onclick="printJS('printJS-form', 'html')">
Print Form
</button>
В приведенном ниже примере показано, как вы можете нажать на кнопку, напримерButton 1
текст, и появится ТОЛЬКО эта кнопка. Некоторые заметки о моем решении, которое было протестировано на моем Mac, в том числе в браузерах Safari, Firefox, Chrome и Edge:
- При нажатии на тег:
-
hideAllElemsOnPrint
Функция JS:
все элементы HTML (за исключениемhtml
тег) добавлен класс, который скрывает элементы с помощью тега@media print {...}
медиа-запрос в CSS с помощьюdisplay: none;
-
onPrintEvents
иupdateParentElemClasses
Функции JS:
ТОЛЬКО тег, по которому щелкают мышью (и все родительские теги, заключающие в себе этот тег).button
тег) удалить класс и добавить класс - Класс НИЧЕГО не делает, но упрощает отладку моего кода и не имеет стилей в CSS.
-
exitPrintEvents
Функция JS:
запускается, когда вы видите всплывающее диалоговое окно печати и ПОСЛЕ того, как вы нажимаете на кнопкуCancel
илиPrint
кнопки в диалоге и.show-print
и.hide-print
классы удалены из всех элементов
-
Попробуй это:
Надеюсь это поможет.
Вот другое (возможно, более современное?) Решение:
<link rel="stylesheet" media="print" href="print.css">
Установите стиль элемента, который вы хотите напечатать, на position:fixed, затем сделайте так, чтобы он покрывал всю страницу.