我正在尝试打印我的应用程序的特定部分。
应用程序有一个用户列表,显示他们的名字和姓氏。当我点击一个用户时,我会得到一个包含更多详细信息的弹出窗口。
如何为我点击的用户打印弹出窗口? 弹出窗口如下所示:
<div id="user<?=$user->id;?>" class="popup">
<div class="details">
User details...
</div>
<a href="#print">Print</a>
</div>
但是打印按钮还没有工作。
答案 0 :(得分:125)
您可以使用简单的JavaScript从页面打印特定的div。
var prtContent = document.getElementById("your div id");
var WinPrint = window.open('', '', 'left=0,top=0,width=800,height=900,toolbar=0,scrollbars=0,status=0');
WinPrint.document.write(prtContent.innerHTML);
WinPrint.document.close();
WinPrint.focus();
WinPrint.print();
WinPrint.close();
答案 1 :(得分:9)
您必须打开一个新窗口(或导航到新页面),其中只包含您希望用户能够打印的信息
Javscript:
function printInfo(ele) {
var openWindow = window.open("", "title", "attributes");
openWindow.document.write(ele.previousSibling.innerHTML);
openWindow.document.close();
openWindow.focus();
openWindow.print();
openWindow.close();
}
HTML:
<div id="....">
<div>
content to print
</div><a href="#" onclick="printInfo(this)">Print</a>
</div>
这里有一些注意事项:锚点之间不能有空格和包含要打印内容的div
答案 2 :(得分:8)
我制作了这个jQuery扩展来打印所选元素的HTML:$('#div2').print();
$.fn.extend({
print: function() {
var frameName = 'printIframe';
var doc = window.frames[frameName];
if (!doc) {
$('<iframe>').hide().attr('name', frameName).appendTo(document.body);
doc = window.frames[frameName];
}
doc.document.body.innerHTML = this.html();
doc.window.print();
return this;
}
});
在行动here中查看。
答案 3 :(得分:7)
您可以使用简单的CSS
实现此目的,而不是使用所有复杂的JavaScript:只使用两个CSS文件,一个用于正常的屏幕显示,另一个用于显示仅您要打印的内容。在后一个文件中,隐藏您不想要打印的所有内容,仅显示弹出窗口。
请记住定义两个CSS文件的media
属性:
<link rel="stylesheet" href="screen-css.css" media="all" />
<link rel="stylesheet" href="print-css.css" media="print" />
答案 4 :(得分:5)
只需使用CSS隐藏您不想要打印的内容。 当用户选择打印时 - 页面将查看“ media =”print“ CSS以获取有关页面布局的说明。
media =“print” CSS包含隐藏我们不想要打印的内容的说明。
<!-- CSS for the things we want to print (print view) -->
<style type="text/css" media="print">
#SCREEN_VIEW_CONTAINER{
display: none;
}
.other_print_layout{
background-color:#FFF;
}
</style>
<!-- CSS for the things we DO NOT want to print (web view) -->
<style type="text/css" media="screen">
#PRINT_VIEW{
display: none;
}
.other_web_layout{
background-color:#E0E0E0;
}
</style>
<div id="SCREEN_VIEW_CONTAINER">
the stuff I DO NOT want printed is here and will be hidden -
and not printed when the user selects print.
</div>
<div id="PRINT_VIEW">
the stuff I DO want printed is here.
</div>
答案 5 :(得分:3)
这是我的增强版本,当我们要加载css文件或要打印的部件中有图像参考时。
在这些情况下,我们必须等到css文件或图像完全加载后再调用print()函数。因此,我们最好将print()和close()函数调用移动到html中。以下是代码示例:
var prtContent = document.getElementById("order-to-print");
var WinPrint = window.open('', '', 'left=0,top=0,width=384,height=900,toolbar=0,scrollbars=0,status=0');
WinPrint.document.write('<html><head>');
WinPrint.document.write('<link rel="stylesheet" href="assets/css/print/normalize.css">');
WinPrint.document.write('<link rel="stylesheet" href="assets/css/print/receipt.css">');
WinPrint.document.write('</head><body onload="print();close();">');
WinPrint.document.write(prtContent.innerHTML);
WinPrint.document.write('</body></html>');
WinPrint.document.close();
WinPrint.focus();
答案 6 :(得分:1)
我有更好的选择,
首先按类名或ID
分隔可打印和不可打印的部分
window.onafterprint = onAfterPrint;
function print(){
//hide the nonPrintable div
}
function onAfterPrint(){
// Visible the nonPrintable div
}
<input type="button" onclick="print()" value="Print"/>
这就是全部
答案 7 :(得分:1)
样式
@media print {
.no-print{
display : none !important;
}
}
jQuery
function printInvoice()
{
printDiv = "#printDiv"; // id of the div you want to print
$("*").addClass("no-print");
$(printDiv+" *").removeClass("no-print");
$(printDiv).removeClass("no-print");
parent = $(printDiv).parent();
while($(parent).length)
{
$(parent).removeClass("no-print");
parent = $(parent).parent();
}
window.print();
}
打印按钮HTML
<input type="button" onclick="printInvoice();" value="Print">
答案 8 :(得分:1)
尝试一下:
在JSFiddle中尝试一下(iframe在StackOverflow的预览中似乎无法正常工作)
您可以在此处看到代码,但是由于StackOverflow渲染器中可能存在安全限制,因此无法使用。
const printButton = document.getElementById('print-button');
printButton.addEventListener('click', event => {
// build the new HTML page
const content = document.getElementById('name-card').innerHTML;
const printHtml = `<html>
<head>
<meta charset="utf-8">
<title>Name Card</title>
</head>
<body>${content}</body>
</html>`;
// get the iframe
let iFrame = document.getElementById('print-iframe');
// set the iFrame contents and print
iFrame.contentDocument.body.innerHTML = printHtml;
iFrame.focus();
iFrame.contentWindow.print();
});
<h1>Print your name badge</h1>
<div id="name-card" class="card">
<p>Hello my name is</p>
<h2>Max Powers</h2>
</div>
<p>You will be required to wear your name badge at all times</p>
<a id="print-button" class="btn btn-primary">Print</a>
<iframe id="print-iframe" width="0" height="0"></iframe>
答案 9 :(得分:0)
在这里回答:https://stackoverflow.com/a/1072151/421243,您可以使用Javascript将特定部分添加到隐藏框架中,将其聚焦并打印出来。
答案 10 :(得分:0)
在printPageArea()
功能中,传递要打印的特定div ID。我从codexworld.com找到了这个JavaScript代码。
function printPageArea(areaID){
var printContent = document.getElementById(areaID);
var WinPrint = window.open('', '', 'width=900,height=650');
WinPrint.document.write(printContent.innerHTML);
WinPrint.document.close();
WinPrint.focus();
WinPrint.print();
WinPrint.close();
}
完整的代码和教程可以在这里找到 - How to Print Page Area using JavaScript。
答案 11 :(得分:0)
我编写了一个名为PrintElements的微型JavaScript模块,用于动态打印部分网页。
它通过遍历选定的节点元素来工作,并且对于每个节点,它遍历DOM树直到BODY元素。在每个级别上,包括初始级别(这是要打印的节点级别),它都将标记类(pe-preserve-print
)附加到当前节点。然后,将另一个标记类(pe-no-print
)附加到当前节点的所有同级上,但前提是它们上没有pe-preserve-print
类。作为第三步,它还将另一个类附加到保留的祖先元素pe-preserve-ancestor
。
一个非常简单的仅打印辅助CSS会隐藏并显示各个元素。这种方法的好处是保留了所有样式,不会打开新窗口,不需要在很多DOM元素之间移动,并且通常对原始文档无害。
请参阅demo,或阅读相关文章for further details。
答案 12 :(得分:0)
尝试这个很棒的ink-html库
password
答案 13 :(得分:0)
这对我有用
使用jQuery和https://developer.mozilla.org/en-US/docs/Web/API/Window/open
s
app-print.css
var $linkToOpenPrintDialog = $('#tvcPrintThisLinkId');
var windowObjectReference = null;
var windowFeatures = 'left=0,top=0,width=800,height=900,menubar=no,toolbar=no,location=yes,resizable=no,scrollbars=no,status=no';
var windowFeaturesStyles = '<link rel="stylesheet" media="print" href="/wp-content/themes/salient-child/dist/css/app-print.css">';
$linkToOpenPrintDialog.on('click', function(event) {
openPrintDialog(this.href, this.target, 'tvcInnerCalculatorDivId', event);
return false;
});
function openPrintDialog(url, windowName, elementToOpen, event) {
var elementContent = document.getElementById(elementToOpen);
if(windowObjectReference == null || windowObjectReference.closed) {
windowObjectReference = window.open( url, windowName, windowFeatures);
windowObjectReference.document.write(windowFeaturesStyles);
windowObjectReference.document.write(elementContent.innerHTML);
windowObjectReference.document.close();
windowObjectReference.focus();
windowObjectReference.print();
windowObjectReference.close();
} else {
windowObjectReference.focus();
};
event.preventDefault();
}
答案 14 :(得分:0)
尝试这个。
export function printSectionOfWebpage(sectionSelector) {
const $body = jquery('body');
const $sectionToPrint = jquery(sectionSelector);
const $sectionToPrintParent = $sectionToPrint.parent();
const $printContainer = jquery('<div style="position:relative;">');
$printContainer.height($sectionToPrint.height()).append($sectionToPrint).prependTo($body);
const $content = $body.children().not($printContainer).not('script').detach();
/**
* Needed for those who use Bootstrap 3.x, because some of
* its `@media print` styles ain't play nicely when printing.
*/
const $patchedStyle = jquery('<style media="print">')
.text(
`
img { max-width: none !important; }
a[href]:after { content: ""; }
`
)
.appendTo('head');
window.print();
$body.prepend($content);
$sectionToPrintParent.prepend($sectionToPrint);
$printContainer.remove();
$patchedStyle.remove();
}