打印网页的特定部分

时间:2012-10-21 10:44:28

标签: javascript html printing

我正在尝试打印我的应用程序的特定部分。

应用程序有一个用户列表,显示他们的名字和姓氏。当我点击一个用户时,我会得到一个包含更多详细信息的弹出窗口。

如何为我点击的用户打印弹出窗口? 弹出窗口如下所示:

 <div id="user<?=$user->id;?>" class="popup">
      <div class="details">
           User details...
      </div>
      <a href="#print">Print</a>
 </div>

但是打印按钮还没有工作。

15 个答案:

答案 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)

尝试一下:

  1. 将容器的innerHTML转储到iFrame中(以及所有特定于打印的CSS
  2. 打印iFrame内容。

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();
}