JQueryを使用してdivのコンテンツを印刷したい。この質問はすでにSOで尋ねられていますが、正しい(実用的な)答えが見つかりません。
これは私のHTMLです:
<div id='printarea'>
<p>This is a sample text for printing purpose.</p>
<input type='button' id='btn' value='Print'>
</div>
<p>Do not print.</p>
ここで、div printarea
の内容を印刷します。
私はこれを試しました:
$("#btn").click(function () {
$("#printarea").print();
});
ただし、ボタンをクリックするとコンソールエラーが発生します。
不明なTypeError:$(...)。printは関数ではありません
しかし、私が使用してページ全体を印刷しようとしているとき
window.print();
それは働いています。ただし、特定のdivのコンテンツのみを印刷したいです。私は多くの場所で$("#printarea").print();
という答えを見ましたが、これは機能していません。
JQueryの研究の一部が失敗したため、JavaScriptに移行しました(ご提案ありがとうございます Anders )。
そして、それはうまく機能しています...
HTML
<div id='DivIdToPrint'>
<p>This is a sample text for printing purpose.</p>
</div>
<p>Do not print.</p>
<input type='button' id='btn' value='Print' onclick='printDiv();'>
JavaScript
function printDiv()
{
var divToPrint=document.getElementById('DivIdToPrint');
var newWin=window.open('','Print-Window');
newWin.document.open();
newWin.document.write('<html><body onload="window.print()">'+divToPrint.innerHTML+'</body></html>');
newWin.document.close();
setTimeout(function(){newWin.close();},10);
}
プラグインを使用せずに、このロジックを選択できます。
$("#btn").click(function () {
//Hide all other elements other than printarea.
$("#printarea").show();
window.print();
});
余分なプラグイン( printThis など)なしでこれを実行したい場合、これは機能するはずです。アイデアは、印刷される特別なdivを持ち、他のすべてはCSSを使用して非表示にすることです。 divがbodyタグの直接の子である場合、これは簡単です。したがって、印刷したいものはすべて、そのようなdivに移動する必要があります。 Sしたがって、bodyタグの直接の子として、ID print-me
のdivを作成することから始めます。次に、次のコードを使用してdivを印刷します。
$("#btn").click(function () {
//Copy the element you want to print to the print-me div.
$("#printarea").clone().appendTo("#print-me");
//Apply some styles to hide everything else while printing.
$("body").addClass("printing");
//Print the window.
window.print();
//Restore the styles.
$("body").removeClass("printing");
//Clear up the div.
$("#print-me").empty();
});
必要なスタイルは次のとおりです。
@media print {
/* Hide everything in the body when printing... */
body.printing * { display: none; }
/* ...except our special div. */
body.printing #print-me { display: block; }
}
@media screen {
/* Hide the special layer from the screen. */
#print-me { display: none; }
}
printing
クラスが存在する場合に@print
スタイルのみを適用する理由は、ユーザーがFile -> Print
を選択してページを印刷する場合、ページを通常どおり印刷する必要があるためです。
このライブラリを使用します: Print.JS
このライブラリを使用すると、HTMLとPDFの両方を印刷できます。
<form method="post" action="#" id="printJS-form">
...
</form>
<button type="button" onclick="printJS('printJS-form', 'html')">
Print Form
</button>
上記のソリューションはどれも完全に機能しません。CSSを失うか、外部CSSファイルをインクルード/編集する必要があります。 CSSを失い、外部CSSを編集/追加する必要のない完璧なソリューションを見つけました。
HTML:
<div id='printarea'>
<p>This is a sample text for printing purpose.</p>
<input type='button' id='btn' value='Print' onclick='printFunc();'>
</div>
<p>Do not print.</p
JQuery:
function printFunc() {
var divToPrint = document.getElementById('printarea');
var htmlToPrint = '' +
'<style type="text/css">' +
'table th, table td {' +
'border:1px solid #000;' +
'padding;0.5em;' +
'}' +
'</style>';
htmlToPrint += divToPrint.outerHTML;
newWin = window.open("");
newWin.document.write("<h3 align='center'>Print Page</h3>");
newWin.document.write(htmlToPrint);
newWin.print();
newWin.close();
}
以下のcodepenのコードは、私が望んでいたように機能しました。
function printData()
{
var divToPrint=document.getElementById("printTable");
newWin= window.open("");
newWin.document.write(divToPrint.outerHTML);
newWin.print();
newWin.close();
}
$('button').on('click',function(){
printData();
})
リンクはこちら codepen
HTML:
<div class="print">
<p>Print 1</p>
<a href="#" class="js-print-link">Click Me To Print</a>
</div>
<div class="print">
<p>Print 2</p>
<a href="#" class="js-print-link">Click Me To Print</a>
</div>
JQuery:
$('.js-print-link').on('click', function() {
var printBlock = $(this).parents('.print').siblings('.print');
printBlock.hide();
window.print();
printBlock.show();
});
ここではプラグイン以外のアプローチをすべて試しましたが、コンテンツの後に空白ページが印刷されるか、他の問題が発生しました。私のソリューションは次のとおりです。
HTML:
<body>
<div id="page-content">
<div id="printme">Content To Print</div>
<div>Don't print this.</div>
</div>
<div id="hidden-print-div"></div>
</body>
Jquery:
$(document).ready(function () {
$("#hidden-print-div").html($("#printme").html());
});
Css:
#hidden-print-div {
display: none;
}
@media print {
#hidden-print-div {
display: block;
}
#page-content {
display: none;
}
}
これを見てください プラグイン
-> $('SelectorToPrint').printElement();
と同じくらい簡単にコードを作成します
この機能を更新します
これで、任意のタグまたはページの任意の部分を完全なスタイルで印刷できます
jquery.jsファイルを含める必要があります
HTML
<div id='DivIdToPrint'>
<p>This is a sample text for printing purpose.</p>
</div>
<p>Do not print.</p>
<input type='button' id='btn' value='Print' onclick='printtag("DivIdToPrint");' >
JavaScript
function printtag(tagid) {
var hashid = "#"+ tagid;
var tagname = $(hashid).prop("tagName").toLowerCase() ;
var attributes = "";
var attrs = document.getElementById(tagid).attributes;
$.each(attrs,function(i,elem){
attributes += " "+ elem.name+" ='"+elem.value+"' " ;
})
var divToPrint= $(hashid).html() ;
var head = "<html><head>"+ $("head").html() + "</head>" ;
var allcontent = head + "<body onload='window.print()' >"+ "<" + tagname + attributes + ">" + divToPrint + "</" + tagname + ">" + "</body></html>" ;
var newWin=window.open('','Print-Window');
newWin.document.open();
newWin.document.write(allcontent);
newWin.document.close();
// setTimeout(function(){newWin.close();},10);
}