DIVの内容を印刷する


335

DIVの内容を印刷する最良の方法は何ですか?



1
印刷とはどういう意味ですか?物理的なプリンターのように?
Yuriy Faktorovich、2010

プリンターのように「印刷」?またはドキュメントに?
Ed Schembor 2010


3
divを印刷するというこの問題の解決策を探している人のためのリファレンスとして。私は次の回答が非常に役立つと感じました:stackoverflow.com/a/7532581/405117
Vikram

回答:


517

以前のバージョンとのわずかな変更-CHROMEでテスト済み

function PrintElem(elem)
{
    var mywindow = window.open('', 'PRINT', 'height=400,width=600');

    mywindow.document.write('<html><head><title>' + document.title  + '</title>');
    mywindow.document.write('</head><body >');
    mywindow.document.write('<h1>' + document.title  + '</h1>');
    mywindow.document.write(document.getElementById(elem).innerHTML);
    mywindow.document.write('</body></html>');

    mywindow.document.close(); // necessary for IE >= 10
    mywindow.focus(); // necessary for IE >= 10*/

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

    return true;
}

8
これは簡単な解決策です。理想的なソリューションは、印刷用に別のCSSを使用することです。おそらく、問題の詳細(要件)について詳しく説明できます。
Bill Paetzke、2010

6
ポップアップウィンドウでスタイルシートを参照できます。<head>タグの間に別のコード行を追加します。mywindow.document.write( '<link rel = "stylesheet" href = "main.css" type = "text / css" />');
Bill Paetzke、2010

5
@Rahilを次のように変更します。mywindow.document.close(); mywindow.focus(); mywindow.print(); mywindow.close();
ROFLwTIME 2013

3
^ newwindow.focus();を追加します。クロスブラウザの印刷を有効にします。
JackMahoney 2013

7
印刷プレビューの読み込みに失敗した場合、おそらく印刷するコンテンツが非常に大きい場合に発生します(同じページがFirefoxで正常に印刷されているのにChromeでしか気付かなかったが、Firefoxや他のブラウザーでも発生する可能性があることを除外しません)。私が見つけた最良の方法は、ウィンドウがロードされた後にのみ印刷を実行(および閉じる)することです。だから後:mywindow.document.write(data);これを追加:mywindow.document.write('<script type="text/javascript">$(window).load(function() { window.print(); window.close(); });</script>');そして削除:mywindow.print();そしてmywindow.close();
Fabius

164

より良い解決策があると思います。divを印刷してドキュメント全体を覆うようにしますが、印刷されたときのみです。

@media print {
    .myDivToPrint {
        background-color: white;
        height: 100%;
        width: 100%;
        position: fixed;
        top: 0;
        left: 0;
        margin: 0;
        padding: 15px;
        font-size: 14px;
        line-height: 18px;
    }
}

完璧です。ポップアップよりずっといいです。
GreenWebDev 2012

5
:残念ながら、それは予想されるほど、この参照のIEで動作しませんstackoverflow.com/questions/975129/...
jarek.jpa

16
複数のページにオーバーフローするはずのコンテンツがChromeで切り捨てられているようです。
Ishmael Smyrnow

IEでは、残りのドキュメントを非表示にする必要があります。上記を次のように変更すると機能します。@media print {body * {display:none; } .myDivToPrint {display:block; 背景色:白; 高さ:100%; 幅:100%; 位置:固定。上:0; 左:0; マージン:0; パディング:15px; font-size:14px; line-height:18px; }}
RonnBlack

2
z-index:9999999を指定する必要があるかもしれません。他の要素がより高い位置にある場合。
Adam M.

43

これは@gabeで言われていますが、jQueryを使用している場合は、私のprintElementプラグインを使用できます。

ここにサンプルがあり、プラグインの詳細についてはここにあります

使い方はかなり単純です。jQueryセレクターで要素を取得して出力するだけです。

$("#myDiv").printElement();

お役に立てば幸いです。


14
8年後、これは "a.browser is undefined"を生成します。これは、.browser呼び出しがjquery 1.9で削除されたためです
KingsInnerSoul

1
@KingsInnerSoulはjQueryユーザーにとって失礼なことではありません。これらの時間は彼らにとって十分厳しいです; p
Alexandre Daubricourt

@AlexandreDaubricourt lol
KingsInnerSoul

22

Jqueryを使用して、次の関数を使用します。

<script>
function printContent(el){
var restorepage = $('body').html();
var printcontent = $('#' + el).clone();
$('body').empty().html(printcontent);
window.print();
$('body').html(restorepage);
}
</script>

印刷ボタンは次のようになります。

<button id="print" onclick="printContent('id name of your div');" >Print</button>

編集:保持する必要があるフォームデータがある場合、クローンはそれをコピーしないので、すべてのフォームデータを取得して、復元後にそれを置き換える必要があります。

<script>
function printContent(el){
var restorepage = $('body').html();
var printcontent = $('#' + el).clone();
var enteredtext = $('#text').val();
$('body').empty().html(printcontent);
window.print();
$('body').html(restorepage);
$('#text').html(enteredtext);
}
</script>
<textarea id="text"></textarea>

$( 'body')。html(restorepage); 現時点では利用可能なbody要素がないため、機能しません。したがって、location.reload();に置き換える方が適切です。
デバッガ

いいえ。ページをリロードすると、フォーム内の情報や、そこに必要なその他の設定が削除されます。それは完全にうまく働きます。時間をかけてコードを見ると、var restorepageには、置換を行うために使用できるすべてのページ情報が含まれていることがわかります。コードの編集をやめて、自分でテストするか、関数の各部分の機能を学習してください。
Gary Hayes

これの方が良い。それは私がまだヘッダーなどからcssリンクを置く必要がある上記のものとは異なり、印刷中のページデザインを含みます。ありがとう!
Jorz

el特にjQを使用しているので、あなたが渡した方法はひどいです。単純に渡してselectorハードコードを取り除く方がはるかに良い#
RozzA

今日はいつもこの方法を使用していましたが、Androidデバイス(Google Chrome)では正しく機能しないことに気付きました。ページの印刷可能領域は毎回変わり、から余分な部分がいくつか含まれていますel。本文が復元されているときに印刷コマンドが送信されると思います。
Ali Sheikhpour

18

ここからhttp://forums.asp.net/t/1261525.aspx

<html>

<head>
    <script language="javascript">
        function printdiv(printpage) {
            var headstr = "<html><head><title></title></head><body>";
            var footstr = "</body>";
            var newstr = document.all.item(printpage).innerHTML;
            var oldstr = document.body.innerHTML;
            document.body.innerHTML = headstr + newstr + footstr;
            window.print();
            document.body.innerHTML = oldstr;
            return false;
        }
    </script>
    <title>div print</title>
</head>

<body>
    //HTML Page //Other content you wouldn't like to print
    <input name="b_print" type="button" class="ipt" onClick="printdiv('div_print');" value=" Print ">

    <div id="div_print">

        <h1 style="Color:Red">The Div content which you want to print</h1>

    </div>
    //Other content you wouldn't like to print //Other content you wouldn't like to print
</body>

</html>

1
footerStrを2つの部分に分割するための変更が必要です。brwoserは現在のページのメインエンドとして「</ body>」を使用するためです。var footstr1 = "</"; var footstr2 = "body>"; var footerstr = footstr1 + footstr12;
mirzaei 2013

13

Bill Paetzke画像を含むdivを印刷するために答えを使用しましたが、Google Chromeでは機能しませんでした

myWindow.onload=function(){はそれを機能させるためにこの行を追加する必要があり、ここに完全なコードがあります

<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.document.close(); // necessary for IE >= 10

            myWindow.onload=function(){ // necessary if the div contain images

                myWindow.focus(); // necessary for IE >= 10
                myWindow.print();
                myWindow.close();
            };
        }
    </script>
</head>
<body>
    <div id="myDiv">
        This will be printed.
        <img src="image.jpg"/>
    </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>

また、誰かがidでdivを印刷する必要がある場合は、jqueryをロードする必要はありません

これはこれを行う純粋なJavaScriptコードです

<html>
<head>
    <script type="text/javascript">
        function PrintDiv(id) {
            var data=document.getElementById(id).innerHTML;
            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.document.close(); // necessary for IE >= 10

            myWindow.onload=function(){ // necessary if the div contain images

                myWindow.focus(); // necessary for IE >= 10
                myWindow.print();
                myWindow.close();
            };
        }
    </script>
</head>
<body>
    <div id="myDiv">
        This will be printed.
        <img src="image.jpg"/>
    </div>
    <div>
        This will not be printed.
    </div>
    <div id="anotherDiv">
        Nor will this.
    </div>
    <input type="button" value="Print Div" onclick="PrintDiv('myDiv')" />
</body>
</html>

これが誰かを助けることを願っています


これは私のために働いた!キャメルケースは私を噛みましたが、元の回答では「mywindow」と「myWindow」を使用しています。ありがとう!
オペコード

12
function printdiv(printdivname) {
    var headstr = "<html><head><title>Booking Details</title></head><body>";
    var footstr = "</body>";
    var newstr = document.getElementById(printdivname).innerHTML;
    var oldstr = document.body.innerHTML;
    document.body.innerHTML = headstr+newstr+footstr;
    window.print();
    document.body.innerHTML = oldstr;
    return false;
}

これにより、必要なdiv領域が印刷され、コンテンツが元の状態に戻ります。printdivnamediv印刷するには。


footerStrを2つの部分に分割するための変更が必要です。brwoserは現在のページのメインエンドとして「</ body>」を使用するためです。var footstr1 = "</"; var footstr2 = "body>"; var footerstr = footstr1 + footstr12;
mirzaei 2013

それは独創的です!しかし、ええ、あなたはmirzaeiからのハックが必要です。それ以外の場合は、bodyタグが壊れてフォーマットが壊れます。ハックで、これはうまくいきます!独自の内部ラッパーを追加して、特別な印刷スタイルを促進することもできます。これは受け入れられる答えになるはずです。
user2662680

9

印刷するコンテンツ以外のすべての要素を非表示にする別の印刷スタイルシートを作成します。それを'media="print"ロードするときに使用してフラグを立てます。

<link rel="stylesheet" type="text/css" media="print" href="print.css" />

これにより、完全に異なるスタイルシートを印刷用にロードできます。

ブラウザーの印刷ダイアログをページに強制的に表示したい場合は、JQueryを使用して、ロード時に次のように行うことができます。

$(function() { window.print(); });

または、ユーザーがボタンをクリックするなど、必要な他のイベントからトリガーされます。


2
はい、それでもうまくいきます。シナリオが何であるかを正確に把握することは困難です。
先のとがった

個別のCSSが理想的なソリューションであることに同意します。そして、divのコンテンツを新しいウィンドウにコピーすることは、迅速な解決策です。
Bill Paetzke、2010

9

これまでに提案されたソリューションには、次の欠点があると思います。

  1. CSSメディアクエリソリューションでは、印刷するdivは1つだけであると想定しています。
  2. JavaScriptソリューションは、特定のブラウザでのみ機能します。
  3. 親ウィンドウのコンテンツを破棄し、再作成して混乱を作成します。

上記のソリューションを改善しました。これは私がテストしたもので、次の利点で本当にうまく機能します。

  1. IE、Chrome、Safari、firefoxを含むすべてのブラウザで動作します。
  2. 親ウィンドウを破棄して再ロードしません。
  3. 1ページに任意の数のDIVを印刷できます。
  4. HTMLテンプレートを使用して、エラーが発生しやすい文字列の連結を回避します。

注意すべき重要なポイント:

  1. 新しく作成したウィンドウにonload = "window.print()"が必要です。
  2. 親からtargetwindow.close()またはtargetwindow.print()を呼び出さないでください。
  3. targetwindow.document.close()とtarget.focus()を必ず実行してください
  4. 私はjqueryを使用していますが、プレーンなJavaScriptを使用しても同じテクニックを実行できます。
  5. この動作はhttp://math.tools/table/multiplicationで確認できます。ボックスヘッダーの印刷ボタンをクリックすると、各テーブルを個別に印刷できます。

<script id="print-header" type="text/x-jquery-tmpl">
   <html>
   <header>
       <title>Printing Para {num}</title>
       <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
       <style>
          body {
            max-width: 300px;
          }
       </style>
   </header>
   <body onload="window.print()">
   <h2>Printing Para {num} </h2>
   <h4>http://math.tools</h4>
</script>
<script id="print-footer" type="text/x-jquery-tmpl">
    </body>
    </html>
</script>
<script>
$('.printthis').click(function() {
   num = $(this).attr("data-id");
   w = window.open();
   w.document.write(
                   $("#print-header").html().replace("{num}",num)  +
                   $("#para-" + num).html() +
                   $("#print-footer").html() 
                   );
   w.document.close();
   w.focus();
   //w.print(); Don't do this otherwise chrome won't work. Look at the onload on the body of the newly created window.
   ///w.close(); Don't do this otherwise chrome won't work
});
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<a class="btn printthis" data-id="1" href="#" title="Print Para 1"><i class="fa fa-print"></i> Print Para 1</a>
<a class="btn printthis" data-id="2" href="#" title="Print Para 2"><i class="fa fa-print"></i> Print Para 2</a>
  
<p class="para" id="para-1">
  Para 1 : Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  

<p class="para" id="para-2">
  Para 2 : Lorem 2 ipsum 2 dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  


これは優れていて、ブラウザ間で受け入れられた結果よりもはるかにうまく機能しました!
dama_do_bling

7

このシナリオに対処するプラグインを作成しました。私はそこにあるプラグインに不満を感じていて、より広範囲で構成可能なものを作ることに着手しました。

https://github.com/jasonday/printThis


1
頑張ってくれたジェイソンさん、どうもありがとうございました。本当に私のより多くのプロジェクトで使用するつもりです。なんて心が吹くようなプラグインの男……

6

承認されたソリューションが機能していませんでした。Chromeが画像を読み込めなかったため、空白のページを印刷していました。このアプローチは機能します:

編集:投稿後に承認されたソリューションが変更されたようです。なぜ反対票か。このソリューションも機能します。

    function printDiv(divName) {

        var printContents = document.getElementById(divName).innerHTML;
        w = window.open();

        w.document.write(printContents);
        w.document.write('<scr' + 'ipt type="text/javascript">' + 'window.onload = function() { window.print(); window.close(); };' + '</sc' + 'ript>');

        w.document.close(); // necessary for IE >= 10
        w.focus(); // necessary for IE >= 10

        return true;
    }

4

これは古い質問であることはわかっていますが、この問題をjQueryで解決しました。

function printContents(id) {
    var contents = $("#"+id).html();

    if ($("#printDiv").length == 0) {
      var printDiv = null;
      printDiv = document.createElement('div');
      printDiv.setAttribute('id','printDiv');
      printDiv.setAttribute('class','printable');
      $(printDiv).appendTo('body');
    }

    $("#printDiv").html(contents);

    window.print();

    $("#printDiv").remove();
}

CSS

  @media print {
    .non-printable, .fancybox-outer { display: none; }
    .printable, #printDiv { 
        display: block; 
        font-size: 26pt;
    }
  }

3

1ページを印刷するには@BCの回答が最適でした。

しかし、A4サイズの複数のページをctrl + Pで同時に印刷するには、次の解決策が役立つ場合があります。

@media print{
html *{
    height:0px!important;
    width:0px !important;
    margin: 0px !important;
    padding: 0px !important;
    min-height: 0px !important;
    line-height: 0px !important;
    overflow: visible !important;
    visibility: hidden ;


}


/*assing myPagesClass to every div you want to print on single separate A4 page*/

 body .myPagesClass {
    z-index: 100 !important;
    visibility: visible !important;
    position: relative !important;
    display: block !important;
    background-color: lightgray !important;
    height: 297mm !important;
    width: 211mm !important;
    position: relative !important;

    padding: 0px;
    top: 0 !important;
    left: 0 !important;
    margin: 0 !important;
    orphans: 0!important;
    widows: 0!important;
    overflow: visible !important;
    page-break-after: always;

}
@page{
    size: A4;
    margin: 0mm ;
    orphans: 0!important;
    widows: 0!important;
}}

2
  • 新しいウィンドウを開く
  • 新しいウィンドウのドキュメントオブジェクトを開いて、取得したdivと必要なhtmlヘッダーなどを含む単純なドキュメントをそこに書き込みます。コンテンツによっては、ドキュメントをスタイルシートに取り込むこともできます。
  • 新しいページにスクリプトを置き、window.print()を呼び出します。
  • スクリプトをトリガーする

2

ここに私のjquery印刷プラグインがあります

(function ($) {

$.fn.printme = function () {
    return this.each(function () {
        var container = $(this);

        var hidden_IFrame = $('<iframe></iframe>').attr({
            width: '1px',
            height: '1px',
            display: 'none'
        }).appendTo(container);

        var myIframe = hidden_IFrame.get(0);

        var script_tag = myIframe.contentWindow.document.createElement("script");
        script_tag.type = "text/javascript";
        script = myIframe.contentWindow.document.createTextNode('function Print(){ window.print(); }');
        script_tag.appendChild(script);

        myIframe.contentWindow.document.body.innerHTML = container.html();
        myIframe.contentWindow.document.body.appendChild(script_tag);

        myIframe.contentWindow.Print();
        hidden_IFrame.remove();

    });
};
})(jQuery);

2

元のドキュメントのすべてのスタイル(インラインスタイルを含む)が必要な場合は、この方法を使用できます。

  1. ドキュメント全体をコピーする
  2. 本文を、印刷する要素に置き換えます。

実装:

class PrintUtil {
  static printDiv(elementId) {
    let printElement = document.getElementById(elementId);
    var printWindow = window.open('', 'PRINT');
    printWindow.document.write(document.documentElement.innerHTML);
    setTimeout(() => { // Needed for large documents
      printWindow.document.body.style.margin = '0 0';
      printWindow.document.body.innerHTML = printElement.outerHTML;
      printWindow.document.close(); // necessary for IE >= 10
      printWindow.focus(); // necessary for IE >= 10*/
      printWindow.print();
      printWindow.close();
    }, 1000)
  }   
}

2
これが最善の解決策であることはわかりませんが、完全に機能しました。ありがとう!
BRogers

それがうまくいくなら、それが一番でなければなりません:)
Stefan Norberg

2

注:これはjQuery対応サイトでのみ機能します

このクールなトリックでとてもシンプルです。それはGoogle Chromeブラウザーで私のために働いた。Firefoxでは、プラグインなしでPDFに印刷することはできません。

  1. まず、(Ctrl + Shift + I)/(Cmd + Option + I)を使用してインスペクターを開きます。
  2. コンソールに次のコードを入力します。

var jqchild = document.createElement('script');
jqchild.src = "https://cdnjs.cloudflare.com/ajax/libs/jQuery.print/1.5.1/jQuery.print.min.js";
document.getElementsByTagName('body')[0].appendChild(jqchild);
$("#myDivWithStyles").print(); // Replace ID with yours
  1. 印刷ダイアログを起動します。物理的な印刷物を作成するか、PDFに保存します(クロムで)。できた!

ロジックは簡単です。新しいスクリプトタグを作成し、それをbodyの終了タグの前に追加します。jQuery印刷拡張機能をHTMLに挿入しました。myDivWithStylesを独自のDivタグIDに変更します。今では、印刷可能な仮想ウィンドウを準備します。

どのサイトでもお試しください。注意が必要なのは、CSSが巧妙に記述されている場合があり、CSSによってスタイルが失われる可能性があることです。しかし、ほとんどの場合、コンテンツを取得します。


1

Operaでは、次のことを試してください。

    print_win.document.write('</body></html>');
    print_win.document.close(); // This bit is important
    print_win.print();
    print_win.close();

1

IEとChromeで機能するIFrameソリューションは次のとおりです。

function printHTML(htmlString) {
    var newIframe = document.createElement('iframe');
    newIframe.width = '1px';
    newIframe.height = '1px';
    newIframe.src = 'about:blank';

    // for IE wait for the IFrame to load so we can access contentWindow.document.body
    newIframe.onload = function() {
        var script_tag = newIframe.contentWindow.document.createElement("script");
        script_tag.type = "text/javascript";
        var script = newIframe.contentWindow.document.createTextNode('function Print(){ window.focus(); window.print(); }');
        script_tag.appendChild(script);

        newIframe.contentWindow.document.body.innerHTML = htmlString;
        newIframe.contentWindow.document.body.appendChild(script_tag);

        // for chrome, a timeout for loading large amounts of content
        setTimeout(function() {
            newIframe.contentWindow.Print();
            newIframe.contentWindow.document.body.removeChild(script_tag);
            newIframe.parentElement.removeChild(newIframe);
        }, 200);
    };
    document.body.appendChild(newIframe);
}

1

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();
}
//usage
document.getElementById('xyz').printMe();
document.getElementsByClassName('xyz')[0].printMe();

お役に立てれば。


1

querySelectorを使用するように@BillPaetskiの回答を変更し、オプションのCSSを追加し、強制されたH1タグを削除して、タイトルをオプションで指定するか、ウィンドウからプルしました。また、自動印刷は行われず、内部が公開されるため、ラッパー関数で、または好きなように切り替えることができます。

唯一の2つのプライベート変数はtmpWindowとtmpDocですが、title、css、およびelemアクセスは異なる場合があるため、すべての関数引数がプライベートであると想定する必要があります。

コード:
function PrintElem(elem, title, css) {
    var tmpWindow = window.open('', 'PRINT', 'height=400,width=600');
    var tmpDoc = tmpWindow.document;

    title = title || document.title;
    css = css || "";

    this.setTitle = function(newTitle) {
        title = newTitle || document.title;
    };

    this.setCSS = function(newCSS) {
        css = newCSS || "";
    };

    this.basicHtml5 = function(innerHTML) {
        return '<!doctype html><html>'+(innerHTML || "")+'</html>';
    };

    this.htmlHead = function(innerHTML) {
        return '<head>'+(innerHTML || "")+'</head>';
    };

    this.htmlTitle = function(title) {
        return '<title>'+(title || "")+'</title>';
    };

    this.styleTag = function(innerHTML) {
        return '<style>'+(innerHTML || "")+'</style>';
    };

    this.htmlBody = function(innerHTML) {
        return '<body>'+(innerHTML || "")+'</body>';
    };

    this.build = function() {
        tmpDoc.write(
            this.basicHtml5(
                this.htmlHead(
                    this.htmlTitle(title) + this.styleTag(css)
                ) + this.htmlBody(
                    document.querySelector(elem).innerHTML
                )
            )
        );
        tmpDoc.close(); // necessary for IE >= 10
    };

    this.print = function() {
        tmpWindow.focus(); // necessary for IE >= 10*/
        tmpWindow.print();
        tmpWindow.close();
    };

    this.build();
    return this;
}
使用法:
DOMPrinter = PrintElem('#app-container');
DOMPrinter.print();

また、<input>要素の値はコピーされません。ユーザーが入力したものを含め、これをどのように使用できますか?
Malcolm Salvador

@ Malky.Kidはあなたが何を求めているのか考えてください。フォームを印刷したい場合は、フォーム要素にぼかしイベントをフックする必要がある、との属性値、選択、デフォルトとのinnerTextを設定し<input><select><textarea>compontentsがその実行時の値になるように。そこの選択肢がありますが、それは、このスクリプトに問題はなく、ブラウザがどのように動作するかとの問題ではない、と取得innerHTMLキャンバスなどの入力を備えた文書のプロパティを
MrMesees

を介してすでに解決策に到達しました.attr('value',)。textarea(追加による)とチェックボックス(.attr('checked',))に対してもそれを行いました。アイム申し訳ありません、私は私が求めていたものについては十分に考えていなかった場合。
マルコムサルバドール

クラスと共有したいですか?多分コメントの要旨か何か。賛成します。
MrMesees 2017

0

以下のコードは、CSSセレクターをターゲットにするために使用される多くの親要素がないため、クエリセレクターによってターゲットとされるすべての関連ノードをコピーし、画面に表示されるようにそれらのスタイルをコピーします。これにより、多くのスタイルを持つ子ノードが多数ある場合、少し遅れが生じます。

理想的には印刷スタイルシートの準備ができていますが、これは挿入する印刷スタイルシートがなく、画面に表示されているとおりに印刷したい場合に使用します。

このページのブラウザコンソールで以下のアイテムをコピーすると、このページのすべてのコードスニペットが印刷されます。

+function() {
    /**
     * copied from  /programming/19784064/set-javascript-computed-style-from-one-element-to-another
     * @author Adi Darachi https://stackoverflow.com/users/2318881/adi-darachi
     */
    var copyComputedStyle = function(from,to){
        var computed_style_object = false;
        //trying to figure out which style object we need to use depense on the browser support
        //so we try until we have one
        computed_style_object = from.currentStyle || document.defaultView.getComputedStyle(from,null);

        //if the browser dose not support both methods we will return null
        if(!computed_style_object) return null;

            var stylePropertyValid = function(name,value){
                        //checking that the value is not a undefined
                return typeof value !== 'undefined' &&
                        //checking that the value is not a object
                        typeof value !== 'object' &&
                        //checking that the value is not a function
                        typeof value !== 'function' &&
                        //checking that we dosent have empty string
                        value.length > 0 &&
                        //checking that the property is not int index ( happens on some browser
                        value != parseInt(value)

            };

        //we iterating the computed style object and compy the style props and the values
        for(property in computed_style_object)
        {
            //checking if the property and value we get are valid sinse browser have different implementations
                if(stylePropertyValid(property,computed_style_object[property]))
                {
                    //applying the style property to the target element
                        to.style[property] = computed_style_object[property];

                }   
        }   

    };


    // Copy over all relevant styles to preserve styling, work the way down the children tree.
    var buildChild = function(masterList, childList) {
        for(c=0; c<masterList.length; c++) {
           var master = masterList[c];
           var child = childList[c];
           copyComputedStyle(master, child);
           if(master.children && master.children.length > 0) {
               buildChild(master.children, child.children);
           }
        }
    }

    /** select elements to print with query selector **/
    var printSelection = function(querySelector) {
        // Create an iframe to make sure everything is clean and ordered.
        var iframe = document.createElement('iframe');
        // Give it enough dimension so you can visually check when modifying.
        iframe.width = document.width;
        iframe.height = document.height;
        // Add it to the current document to be sure it has the internal objects set up.
        document.body.append(iframe);

        var nodes = document.querySelectorAll(querySelector);
        if(!nodes || nodes.length == 0) {
           console.error('Printing Faillure: Nothing to print. Please check your querySelector');
           return;
        }

        for(i=0; i < nodes.length; i++) {

            // Get the node you wish to print.
            var origNode = nodes[i];

            // Clone it and all it's children
            var node = origNode.cloneNode(true);

            // Copy the base style.
            copyComputedStyle(origNode, node);

            if(origNode.children && origNode.children.length > 0) {
                buildChild(origNode.children, node.children);
            }

            // Add the styled clone to the iframe. using contentWindow.document since it seems the be the most widely supported version.

            iframe.contentWindow.document.body.append(node);
        }
        // Print the window
        iframe.contentWindow.print();

        // Give the browser a second to gather the data then remove the iframe.
        window.setTimeout(function() {iframe.parentNode.removeChild(iframe)}, 1000);
    }
window.printSelection = printSelection;
}();
printSelection('.default.prettyprint.prettyprinted')

0

これは本当に古い投稿ですが、正解を使用して作成した更新の1つを示します。私のソリューションでもjQueryを使用しています。

これのポイントは、適切な印刷ビューを使用し、適切な書式設定のためのすべてのスタイルシートを含め、ほとんどのブラウザーでサポートされることです。

function PrintElem(elem, title, offset)
{
    // Title constructor
    title = title || $('title').text();
    // Offset for the print
    offset = offset || 0;

    // Loading start
    var dStart = Math.round(new Date().getTime()/1000),
        $html = $('html');
        i = 0;

    // Start building HTML
    var HTML = '<html';

    if(typeof ($html.attr('lang')) !== 'undefined') {
        HTML+=' lang=' + $html.attr('lang');
    }

    if(typeof ($html.attr('id')) !== 'undefined') {
        HTML+=' id=' + $html.attr('id');
    }

    if(typeof ($html.attr('xmlns')) !== 'undefined') {
        HTML+=' xmlns=' + $html.attr('xmlns');
    }

    // Close HTML and start build HEAD
    HTML+='><head>';

    // Get all meta tags
    $('head > meta').each(function(){
        var $this = $(this),
            $meta = '<meta';

        if(typeof ($this.attr('charset')) !== 'undefined') {
            $meta+=' charset=' + $this.attr('charset');
        }

        if(typeof ($this.attr('name')) !== 'undefined') {
            $meta+=' name=' + $this.attr('name');
        }

        if(typeof ($this.attr('http-equiv')) !== 'undefined') {
            $meta+=' http-equiv=' + $this.attr('http-equiv');
        }

        if(typeof ($this.attr('content')) !== 'undefined') {
            $meta+=' content=' + $this.attr('content');
        }

        $meta+=' />';

        HTML+= $meta;
        i++;

    }).promise().done(function(){

        // Insert title
        HTML+= '<title>' + title  + '</title>';

        // Let's pickup all CSS files for the formatting
        $('head > link[rel="stylesheet"]').each(function(){
            HTML+= '<link rel="stylesheet" href="' + $(this).attr('href') + '" />';
            i++;
        }).promise().done(function(){
            // Print setup
            HTML+= '<style>body{display:none;}@media print{body{display:block;}}</style>';

            // Finish HTML
            HTML+= '</head><body>';
            HTML+= '<h1 class="text-center mb-3">' + title  + '</h1>';
            HTML+= elem.html();
            HTML+= '</body></html>';

            // Open new window
            var printWindow = window.open('', 'PRINT', 'height=' + $(window).height() + ',width=' + $(window).width());
            // Append new window HTML
            printWindow.document.write(HTML);

            printWindow.document.close(); // necessary for IE >= 10
            printWindow.focus(); // necessary for IE >= 10*/
console.log(printWindow.document);
            /* Make sure that page is loaded correctly */
            $(printWindow).on('load', function(){                   
                setTimeout(function(){
                    // Open print
                    printWindow.print();

                    // Close on print
                    setTimeout(function(){
                        printWindow.close();
                        return true;
                    }, 3);

                }, (Math.round(new Date().getTime()/1000) - dStart)+i+offset);
            });
        });
    });
}

後であなたは単純に次のようなものが必要です:

$(document).on('click', '.some-print', function() {
    PrintElem($(this), 'My Print Title');
    return false;
});

それを試してみてください。


-1

ベストアンサーと同じですが、私がしたように画像を印刷する必要がある場合に備えて:

画像を印刷したい場合:

function printElem(elem)
    {
        Popup(jQuery(elem).attr('src'));
    }

    function Popup(data) 
    {
        var mywindow = window.open('', 'my div', 'height=400,width=600');
        mywindow.document.write('<html><head><title>my div</title>');
        mywindow.document.write('</head><body >');
        mywindow.document.write('<img src="'+data+'" />');
        mywindow.document.write('</body></html>');

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

        return true;
    }

loadポップアップにイベントがありません。それがなければ、画像がロードされないため、空白のページが印刷されます。=>$(popup).load(function(){ popup.focus(); popup.print(); });
Tim Vermaelen

-4

最適な方法は、divのコンテンツをサーバーに送信し、サーバーがそれらのコンテンツを新しいウィンドウに配置できる新しいウィンドウを開くことです。

それがオプションでない場合は、JavaScriptのようなクライアント側の言語を使用して、そのdivを除くページ上のすべてを非表示にしてから、ページを印刷してみることができます...


1
サーバーにバウンスする必要はありません。ブラウザウィンドウを開いて内容を設定し、印刷コマンドを呼び出すことができます。
Jonathon Faust、

クライアントから新しいウィンドウを作成できます。
ポインティ

1
Jonathon:私はそのソリューションが好きです。サンプルコードはありますか?
usertest 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.