单击按钮时如何打印 HTML 内容,而不是页面?

IT技术 javascript html css printing
2021-02-17 22:39:47

当用户单击按钮时,我想打印一些 HTML 内容。一旦用户点击该按钮,浏览器的打印对话框将打开,但不会打印网页。相反,它会打印一些未在页面上显示的其他 HTML 内容。

在问这个问题时,我想到的解决方案很少。但我不确定这些是好主意还是可以做一些更好的事情。其中一种解决方案是:我可以将这个 HTML 内容保存在一个 div 中并使其display:打印,但display: none要进行屏幕显示。网页上的所有其他元素都可以display: none用于打印和display:屏幕。然后调用打印。

有什么更好的主意吗?

6个回答

@media print {
  .noPrint{
    display:none;
  }
}
h1{
  color:#f6f6;
}
<h1>
print me
</h1>
<h1 class="noPrint">
no print
</h1>
<button onclick="window.print();" class="noPrint">
Print Me
</button>

我遇到了另一个优雅的解决方案:

将您的可打印部分放在一个 div 中,其 id 如下所示:

<div id="printableArea">
      <h1>Print me</h1>
</div>

<input type="button" onclick="printDiv('printableArea')" value="print a div!" />

现在让我们创建一个非常简单的 javascript:

function printDiv(divName) {
     var printContents = document.getElementById(divName).innerHTML;
     var originalContents = document.body.innerHTML;

     document.body.innerHTML = printContents;

     window.print();

     document.body.innerHTML = originalContents;
}

来源:所以答案

这似乎过于复杂。@media print 是一个更干净的解决方案(请参阅下面 2ne 的帖子)。
2021-04-26 22:39:47
这可能会破坏加载后由 js 添加的动画和事件。谨慎使用。
2021-05-08 22:39:47
重新附加原始内容后,我的 dom 事件处理程序消失了。
2021-05-10 22:39:47
这会对事件侦听器产生什么影响?
2021-05-11 22:39:47
这将影响打印后的原始页面。
2021-05-14 22:39:47

这是一个纯 css 版本

.example-print {
    display: none;
}
@media print {
   .example-screen {
       display: none;
    }
    .example-print {
       display: block;
    }
}
<div class="example-screen">You only see me in the browser</div>

<div class="example-print">You only see me in the print</div>

@Robusto 一方面同意,但我不喜欢保存页面(无需打印)不太好,更不用说何时处理分页了。从这个意义上说,准备要“打印”的页面是模棱两可的。
2021-05-04 22:39:47
媒体查询的大量使用(Y)
2021-05-10 22:39:47
我喜欢你不需要打开一个新窗口和所有的废话。
2021-05-15 22:39:47

根据此 SO 链接,您可以打印特定的 div

w=window.open();
w.document.write(document.getElementsByClassName('report_left_inner')[0].innerH‌​TML);
w.print();
w.close();
此解决方案需要问题中未提及(或标记)的 JQuery。您应该在答案中指定此依赖项。
2021-04-15 22:39:47
w.document.write(document.getElementsByClassName('report_left_inner')[0].innerHTML);
2021-04-16 22:39:47
这是极好的。不过有一点要注意:您需要单独检查和注入样式规则,否则它会退回到裸 HTML。为此,我个人document.write('<style>'+ ... + '</style>');document.write()此处给出之前做过
2021-04-20 22:39:47
替换$('.report_left_inner').html()为 vanilla js 将使其成为页面上简单和健壮的最佳答案
2021-05-08 22:39:47
这很有趣,但是当我从 Angular 组件尝试它时,我没有将 CSS 应用于新窗口。此外,图像没有时间在写入调用和打印调用之间加载,因此它们直到打印对话框完成后才会出现。
2021-05-12 22:39:47

我想看这个

示例http://jsfiddle.net/35vAN/

    <html>
<head>
<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.1.min.js" > </script> 
<script type="text/javascript">

    function PrintElem(elem)
    {
        Popup($(elem).html());
    }

    function Popup(data) 
    {
        var mywindow = window.open('', 'my div', 'height=400,width=600');
        mywindow.document.write('<html><head><title>my div</title>');
        /*optional stylesheet*/ //mywindow.document.write('<link rel="stylesheet" href="main.css" type="text/css" />');
        mywindow.document.write('</head><body >');
        mywindow.document.write(data);
        mywindow.document.write('</body></html>');

        mywindow.print();
        mywindow.close();

        return true;
    }

</script>
</head>
<body>

<div id="mydiv">
    This will be printed. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque a quam at nibh adipiscing interdum. Nulla vitae accumsan ante. 
</div>

<div>
    This will not be printed.
</div>

<div id="anotherdiv">
    Nor will this.
</div>

<input type="button" value="Print Div" onclick="PrintElem('#mydiv')" />

</body>

</html>
不适用于 IE 11
2021-05-15 22:39:47

下面的代码可能会帮助你:

<html>
<head>
<script>
function printPage(id)
{
   var html="<html>";
   html+= document.getElementById(id).innerHTML;

   html+="</html>";

   var printWin = window.open('','','left=0,top=0,width=1,height=1,toolbar=0,scrollbars=0,status  =0');
   printWin.document.write(html);
   printWin.document.close();
   printWin.focus();
   printWin.print();
   printWin.close();
}
</script>
</head>
<body>
<div id="block1">
<table border="1" >
</tr>
<th colspan="3">Block 1</th>
</tr>
<tr>
<th>1</th><th>XYZ</th><th>athock</th>
</tr>
</table>

</div>

<div id="block2">
    This is Block 2 content
</div>

<input type="button" value="Print Block 1" onclick="printPage('block1');"></input>
<input type="button" value="Print Block 2" onclick="printPage('block2');"></input>
</body>
</html>
哇!这是我在 Stackoverflow 中见过的最直接的答案。
2021-05-10 22:39:47