พิมพ์เนื้อหาของ DIV


336

วิธีที่ดีที่สุดในการพิมพ์เนื้อหาของ DIV คืออะไร?


ลองพิมพ์องค์ประกอบที่นี่
Gabe

1
การพิมพ์หมายถึงอะไร เช่นเดียวกับในเครื่องพิมพ์ทางกายภาพ?
Yuriy Faktorovich

"พิมพ์" ในเครื่องพิมพ์หรือไม่ หรือเอกสาร?
Ed Schembor

ฉันพบปลั๊กอินที่ดีที่สุดแล้วที่พัฒนาโดย etimbo github.com/etimbo/jquery-print-preview-plugin
MaxI

3
เช่นเดียวกับการอ้างอิงสำหรับทุกคนที่พยายามค้นหาวิธีแก้ไขปัญหาสำหรับการพิมพ์ div นี้ ฉันพบคำตอบต่อไปนี้มีประโยชน์มาก: stackoverflow.com/a/7532581/405117
Vikram

คำตอบ:


518

การเปลี่ยนแปลงเล็กน้อยกับรุ่นก่อนหน้านี้ - ทดสอบบน 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

6
คุณสามารถอ้างอิงสไตล์ชีทในหน้าต่างป๊อปอัป เพิ่มอีกบรรทัดของรหัสในระหว่างแท็ก <head>: mywindow.document.write ('<link rel = "stylesheet" href = "main.css" type = "text / css" />');
Bill Paetzke

5
@Rahil เปลี่ยนเป็น: mywindow.document.close (); mywindow.focus (); mywindow.print (); mywindow.close ();
ROFLwTIME

3
^ เพิ่ม newwindow.focus (); เพื่อเปิดใช้งานการพิมพ์ข้ามเบราว์เซอร์
JackMahoney

7
บางครั้งมันเกิดขึ้นหากล้มเหลวในการโหลดตัวอย่างก่อนพิมพ์บางทีเมื่อเนื้อหาที่จะพิมพ์มีขนาดค่อนข้างใหญ่ (ฉันสังเกตเห็นเฉพาะกับ Chrome ในขณะที่หน้าเดียวกันพิมพ์ perfeclty ใน Firefox แต่ฉันไม่ได้ยกเว้นมันอาจเกิดขึ้นใน 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 to print ครอบคลุมเอกสารทั้งหมด แต่เมื่อพิมพ์แล้วเท่านั้น:

@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

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; ขนาดตัวอักษร: 14px; ความสูงบรรทัด: 18px; }}
RonnBlack

2
คุณอาจต้องใส่ดัชนีซี: 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

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>

$ ( 'ร่างกาย') HTML (restorepage). จะไม่ทำงานเพราะในเวลานั้นไม่มีองค์ประกอบของร่างกาย ดังนั้นจึงเป็นการดีที่จะแทนที่ด้วย 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

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>

ถ้ามีคนแค่ต้องพิมพ์ div ด้วย id เขาไม่จำเป็นต้องโหลด jQuery

นี่คือรหัสจาวาสคริปต์บริสุทธิ์ที่จะทำ

<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" ขอบคุณ!
opcode

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พื้นที่ที่คุณต้องการและตั้งค่าเนื้อหากลับเป็นเหมือนเดิม printdivnameเป็นสิ่งdivที่จะพิมพ์


มันจำเป็นต้องมีการดัดแปลงเพื่อแยก footerStr เป็น 2 ส่วน เนื่องจาก brwoser ใช้ "</body>" เป็นจุดสิ้นสุดหลักของหน้าปัจจุบัน var footstr1 = "</"; var footstr2 = "body>"; var footerstr = footstr1 + footstr12;
mirzaei

นั่นเป็นความคิดสร้างสรรค์! แต่ใช่คุณต้องแฮ็คจาก mirzaei อื่น ๆ ที่แบ่งแท็กร่างกายและคุณได้รับการจัดรูปแบบที่แตกสลาย ด้วยแฮ็คสิ่งนี้ใช้ได้ดีมาก! คุณยังสามารถเพิ่ม wrapper ภายในของคุณเองเพื่ออำนวยความสะดวกในรูปแบบการพิมพ์พิเศษ นี่ควรเป็นคำตอบที่ยอมรับได้
2662680

9

สร้างสไตล์ชีทการพิมพ์แยกต่างหากซึ่งซ่อนองค์ประกอบอื่นทั้งหมดยกเว้นเนื้อหาที่คุณต้องการพิมพ์ ตั้งค่าสถานะการใช้งาน'media="print"เมื่อคุณโหลด:

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

สิ่งนี้ช่วยให้คุณโหลดสไตล์ชีทที่แตกต่างไปจากเดิมอย่างสิ้นเชิงสำหรับงานพิมพ์

หากคุณต้องการบังคับให้กล่องโต้ตอบการพิมพ์ของเบราว์เซอร์ปรากฏขึ้นสำหรับหน้าคุณสามารถทำได้โดยโหลด JQuery:

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

หรือทริกเกอร์จากเหตุการณ์อื่น ๆ ที่คุณต้องการเช่นผู้ใช้คลิกปุ่ม


2
ใช่ว่าจะได้ผลเช่นกัน; มันเป็นเรื่องยาก - เป็นไปไม่ได้ที่จะรู้ว่าสถานการณ์คืออะไร
Pointy

ฉันยอมรับว่า CSS แยกต่างหากเป็นทางออกที่ดีที่สุด และการคัดลอกเนื้อหาของ div ไปยังหน้าต่างใหม่เป็นวิธีแก้ปัญหาอย่างรวดเร็ว
Bill Paetzke

9

ฉันคิดว่าแนวทางแก้ไขที่เสนอมามีข้อเสียดังต่อไปนี้:

  1. โซลูชันเคียวรีสื่อบันทึก CSS คิดว่ามีเพียง div เดียวที่จะพิมพ์
  2. โซลูชั่นจาวาสคริปต์ใช้งานได้กับเบราว์เซอร์บางตัวเท่านั้น
  3. ทำลายเนื้อหาหน้าต่างหลักและสร้างใหม่ที่สร้างความยุ่งเหยิง

ฉันได้ปรับปรุงวิธีการแก้ปัญหาข้างต้น นี่คือสิ่งที่ฉันได้ทดสอบว่าทำงานได้ดีจริง ๆ โดยมีประโยชน์ดังต่อไปนี้

  1. ทำงานบนเบราว์เซอร์ทั้งหมดรวมถึง IE, Chrome, Safari และ firefox
  2. ไม่ทำลายและโหลดหน้าต่างหลักอีกครั้ง
  3. สามารถพิมพ์ DIV จำนวนเท่าใดก็ได้ในหน้าเดียว
  4. ใช้เทมเพลต html เพื่อหลีกเลี่ยงข้อผิดพลาดเกี่ยวกับการเรียงสตริง

ประเด็นสำคัญที่ควรทราบ:

  1. จำเป็นต้องมี onload = "window.print ()" บนหน้าต่างที่สร้างขึ้นใหม่
  2. อย่าโทรไปที่ Targetwindow.close () หรือ Targetwindow.print () จากผู้ปกครอง
  3. ตรวจสอบให้แน่ใจว่าคุณกำหนดเป้าหมายไว้ที่.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

แม้ว่าคำตอบ @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

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 (เป็นโครเมี่ยม) ทำ!

ตรรกะนั้นง่าย เรากำลังสร้างแท็กสคริปต์ใหม่และแนบไว้ด้านหน้าแท็กปิดเนื้อหา เราฉีดส่วนขยายการพิมพ์ jQuery ลงใน HTML เปลี่ยนmyDivWithStylesด้วย ID แท็ก Div ของคุณเอง ตอนนี้ต้องเตรียมหน้าต่างเสมือนจริงที่พิมพ์ได้

ลองในเว็บไซต์ใด ๆ มีข้อแม้บางครั้งเขียน CSS เท่านั้นที่สามารถทำให้สไตล์หายไป แต่เราได้รับเนื้อหาเป็นส่วนใหญ่


1

ใน Opera ลอง:

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

1

นี่คือโซลูชัน IFrame ที่ใช้งานได้กับ IE และ Chrome:

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

ฉันแก้ไข @BillPaetski คำตอบที่จะใช้ querySelector เพิ่ม CSS ตัวเลือกลบแท็ก H1 บังคับและทำให้ชื่อเลือกระบุหรือดึงออกจากหน้าต่าง นอกจากนี้ยังไม่พิมพ์อัตโนมัติอีกต่อไปและเปิดโปง internals เพื่อให้พวกเขาสามารถเปลี่ยนในฟังก์ชั่นเสื้อคลุมหรือตามที่คุณต้องการ

vars ส่วนตัวเพียงสองอันเท่านั้นคือ tmpWindow และ tmpDoc ถึงแม้ว่าฉันเชื่อว่าชื่อการเข้าถึง 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

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

นี่คือโพสต์เก่าจริงๆ แต่นี่คือหนึ่งในการอัปเดตของฉันสิ่งที่ฉันทำโดยใช้คำตอบที่ถูกต้อง โซลูชันของฉันยังใช้ 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

คุณสามารถสร้างหน้าต่างใหม่จากลูกค้า
Pointy

1
Jonathon: ฉันชอบทางออกนั้น คุณมีรหัสตัวอย่างหรือไม่?
usertest
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.