In nội dung của DIV


335

Cách tốt nhất để in nội dung của DIV là gì?


Hãy thử phần tử in tại đây
Gabe

1
Bạn có ý nghĩa gì khi in? Như trong một máy in vật lý?
Yuriy Faktorovich

"In" như trong máy in? hoặc vào tài liệu?
Ed Schembor

Tôi đã tìm thấy plugin tốt nhất cho đến nay được phát triển bởi etimbo github.com/etimbo/jquery-print-preview-plugin
MaxI

3
Cũng như một tài liệu tham khảo cho bất cứ ai đang cố gắng tìm kiếm một giải pháp cho câu hỏi in div này. Tôi thấy câu trả lời sau đây rất hữu ích: stackoverflow.com/a/7532581/405117
Vikram

Câu trả lời:


516

Thay đổi nhẹ so với phiên bản trước - đã thử nghiệm trên 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
Đây là một giải pháp nhanh chóng. Giải pháp lý tưởng là sử dụng CSS riêng để in. Có lẽ bạn có thể giải thích chi tiết (yêu cầu) của vấn đề của bạn.
Bill Paetzke

6
Bạn có thể tham khảo biểu định kiểu trong cửa sổ bật lên. Thêm một dòng mã khác ở giữa các thẻ <head>: mywindow.document.write ('<link rel = "styleheet" href = "main.css" type = "text / css" />');
Bill Paetzke

5
@Rahil thay đổi nó thành này: mywindow.document.close (); mywindow.f Focus (); mywindow.print (); mywindow.c Đóng ();
ROFLwTIME

3
^ thêm newwindow.f Focus (); để cho phép in trình duyệt chéo.
JackMahoney

7
Đôi khi điều này xảy ra nếu không tải được bản xem trước in, có thể khi nội dung cần in khá lớn (tôi chỉ nhận thấy nó với Chrome trong khi cùng một trang in bị lỗi trong Firefox, tuy nhiên tôi cũng không loại trừ nó có thể xảy ra trong Firefox hoặc các trình duyệt khác). Cách tốt nhất tôi tìm thấy là chạy bản in (và đóng) chỉ sau khi windows được tải. Vì vậy, sau: mywindow.document.write(data);Thêm cái này: mywindow.document.write('<script type="text/javascript">$(window).load(function() { window.print(); window.close(); });</script>');Và xóa: mywindow.print();mywindow.close();
Fabius

164

Tôi nghĩ rằng có một giải pháp tốt hơn. Tạo div của bạn để in bao trùm toàn bộ tài liệu, nhưng chỉ khi nó được in:

@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;
    }
}

Hoàn hảo, đẹp hơn nhiều so với một cửa sổ bật lên.
GreenWebDev

5
Thật không may, nó sẽ không hoạt động trong IE như mong đợi, hãy xem điều này: stackoverflow.com/questions/975129/iêu
jarek.jpa

16
Nội dung sẽ tràn vào nhiều trang dường như bị cắt ngắn trong Chrome.
Ishmael Smyrnow

Trên IE bạn cần ẩn phần còn lại của tài liệu. Sửa đổi ở trên như sau sẽ hoạt động: @media print {body * {display: none; } .myDivToPrint {display: block; màu nền: trắng; chiều cao: 100%; chiều rộng: 100%; vị trí: cố định; đầu trang: 0; trái: 0; lề: 0; phần đệm: 15px; cỡ chữ: 14px; chiều cao dòng: 18px; }}
RonnBlack

2
Bạn có thể cần đặt chỉ số z: 9999999; trong trường hợp bạn có các yếu tố khác được định vị cao hơn.
Adam M.

43

Mặc dù điều này đã được @gabe nói , nhưng nếu bạn đang sử dụng jQuery, bạn có thể sử dụng printElementplugin của tôi .

Có một mẫu ở đây và thêm thông tin về plugin ở đây .

Việc sử dụng khá đơn giản, chỉ cần lấy một phần tử với bộ chọn jQuery và in nó:

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

Tôi hy vọng nó sẽ giúp!


14
8 năm sau, điều này sẽ tạo ra "a.browser không xác định" vì lệnh gọi .browser đã bị xóa trong jquery 1.9
KingsInnerSoul

1
@KingsInnerSoul đừng thô lỗ với người dùng jQuery, thời gian này đủ khắc nghiệt đối với họ; p
Alexandre Daubricourt

@AlexandreDaubricourt lol
@AlexandreDaubricourt

22

Sử dụng Jquery, chỉ cần sử dụng chức năng này:

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

Nút in của bạn sẽ trông như thế này:

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

Chỉnh sửa: Nếu bạn có dữ liệu biểu mẫu mà bạn cần giữ, hãy sao chép sẽ không sao chép dữ liệu đó, vì vậy bạn sẽ chỉ cần lấy tất cả dữ liệu của biểu mẫu và thay thế sau khi khôi phục như vậy:

<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>

$ ('cơ thể'). html (khôi phục trang); sẽ không hoạt động vì tại thời điểm đó không có yếu tố cơ thể có sẵn. do đó, sẽ tốt hơn khi thay thế nó bằng location.reload ();
Trình gỡ lỗi

Không. Nếu bạn tải lại trang, bạn sẽ xóa bất kỳ thông tin nào trong các biểu mẫu hoặc bất kỳ cài đặt nào khác có thể cần phải ở đó. Nó hoạt động hoàn toàn tốt. Nếu bạn dành thời gian để xem mã, bạn sẽ thấy rằng trang khôi phục var DOES có tất cả thông tin trang có sẵn để thực hiện thay thế. Ngừng cố gắng chỉnh sửa mã của tôi và tự kiểm tra mã hoặc tìm hiểu từng bộ phận của chức năng làm gì.
Gary Hayes

Điều này tốt hơn. Nó bao gồm thiết kế trang trong khi in không giống như những gì được đề cập ở trên, nơi tôi vẫn cần đặt liên kết css từ tiêu đề, vv Cảm ơn!
Jorz

con đường bạn đã đi qua elthật tồi tệ, đặc biệt là từ khi sử dụng jQ. Tốt hơn nhiều chỉ đơn giản là vượt qua selectorvà thoát khỏi mã hóa cứng#
RozzA

Tôi luôn sử dụng phương pháp này ngày hôm nay Tôi nhận thấy rằng nó không hoạt động đúng trên thiết bị Android (Google Chrome). Vùng có thể in của trang thay đổi mỗi lần và chứa một số phần bổ sung el. Tôi nghĩ rằng lệnh in được gửi khi cơ thể đang được khôi phục.
Ali Sheikhpour

18

Từ đây 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
nó cần một sửa đổi để tách footerStr thành 2 phần. bởi vì brwoser sử dụng "</ body>" làm phần cuối chính của trang hiện tại. var footstr1 = "</"; var footstr2 = "cơ thể>"; var footerstr = footstr1 + footstr12;
mirzaei

13

tôi đã sử dụng Bill Paetzkecâu trả lời để in một div chứa hình ảnh nhưng nó không hoạt động với google chrome

tôi chỉ cần thêm dòng này myWindow.onload=function(){để làm cho nó hoạt động và đây là mã đầy đủ

<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>

Ngoài ra, nếu ai đó chỉ cần in một div với id, anh ta không cần phải tải jquery

Đây là mã javascript thuần túy để làm điều này

<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>

tôi hy vọng điều này có thể giúp ai đó


Điều này làm việc cho tôi! Con lạc đà đã cắn tôi mặc dù câu trả lời ban đầu sử dụng "mywindow" so với "myWindow". Cảm ơn!
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;
}

Điều này sẽ in divkhu vực bạn muốn và đặt lại nội dung như cũ. printdivnamedivđể được in.


nó cần một sửa đổi để tách footerStr thành 2 phần. bởi vì brwoser sử dụng "</ body>" làm phần cuối chính của trang hiện tại. var footstr1 = "</"; var footstr2 = "cơ thể>"; var footerstr = footstr1 + footstr12;
mirzaei

Thật tài tình! Nhưng vâng, bạn cần hack từ mirzaei, khác với việc thẻ body bị hỏng và bạn bị hỏng định dạng. Với hack, điều này hoạt động rất tốt! Bạn thậm chí có thể thêm trình bao bọc bên trong của riêng bạn để tạo điều kiện cho các kiểu in đặc biệt. Đây phải là câu trả lời được chấp nhận.
user2662680

9

Tạo một bản định kiểu in riêng biệt ẩn tất cả các thành phần khác ngoại trừ nội dung bạn muốn in. Đánh dấu nó bằng cách sử dụng 'media="print"khi bạn tải nó:

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

Điều này cho phép bạn có một biểu định kiểu hoàn toàn khác được tải cho bản in.

Nếu bạn muốn buộc hộp thoại in của trình duyệt xuất hiện cho trang, bạn có thể làm như thế này khi tải bằng JQuery:

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

hoặc kích hoạt bất kỳ sự kiện nào khác mà bạn muốn, chẳng hạn như người dùng nhấp vào nút.


2
Vâng, điều đó cũng sẽ làm việc; thật khó - tốt, không thể - để biết chính xác kịch bản là gì.
Mũi nhọn

Tôi đồng ý rằng một CSS riêng là giải pháp lý tưởng. Và sao chép nội dung của div sang một cửa sổ mới là một giải pháp nhanh chóng.
Bill Paetzke

9

Tôi nghĩ rằng các giải pháp được đề xuất cho đến nay có những nhược điểm sau:

  1. Các giải pháp truy vấn phương tiện CSS giả định chỉ có một div để in.
  2. Các giải pháp javascript chỉ hoạt động trên một số trình duyệt nhất định.
  3. Phá hủy nội dung cửa sổ cha mẹ và tạo lại đó tạo ra một mớ hỗn độn.

Tôi đã cải thiện các giải pháp trên. Đây là một cái gì đó mà tôi đã thử nghiệm hoạt động thực sự tốt với các lợi ích sau.

  1. Hoạt động trên tất cả các trình duyệt bao gồm IE, Chrome, Safari và firefox.
  2. Không phá hủy và tải lại cửa sổ cha.
  3. Có thể in bất kỳ số lượng DIV nào trong một trang.
  4. Sử dụng các mẫu html để tránh nối chuỗi dễ bị lỗi.

Những điểm chính cần lưu ý:

  1. Phải có một onload = "window.print ()" trên cửa sổ vừa tạo.
  2. Đừng gọi targetwindow.close () hoặc targetwindow.print () từ cha mẹ.
  3. Hãy chắc chắn rằng bạn thực hiện targetwindow.document.close () và target.f Focus ()
  4. Tôi đang sử dụng jquery nhưng bạn cũng có thể thực hiện kỹ thuật tương tự bằng cách sử dụng javascript đơn giản.
  5. Bạn có thể thấy điều này trong hành động ở đây http://math.tools/table/multiplication . Bạn có thể in riêng từng bảng, bằng cách nhấp vào nút in trên tiêu đề hộp.

<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>
  


Điều này là tuyệt vời và làm việc trên nhiều trình duyệt tốt hơn nhiều so với kết quả được chấp nhận!
dama_do_bling

7

Tôi đã tạo ra một plugin để giải quyết tình huống này. Tôi không hài lòng với các plugin ngoài đó, và đặt ra để làm cho một cái gì đó mở rộng / cấu hình hơn.

https://github.com/jasonday/print This


1
Cảm ơn rất nhiều vì sự chăm chỉ của bạn Jason ..... !! Thực sự sẽ sử dụng trong các dự án nhiều hơn của tôi. Thật là một người đàn ông làm phiền tâm trí ...... Không nói nên lời .....

6

Các giải pháp được chấp nhận đã không làm việc. Chrome đã in một trang trống vì nó không tải hình ảnh kịp thời. Cách tiếp cận này hoạt động:

Chỉnh sửa: Có vẻ như giải pháp được chấp nhận đã được sửa đổi sau bài viết của tôi. Tại sao các downvote? Giải pháp này hoạt động như là tốt.

    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

Tôi biết đây là một câu hỏi cũ, nhưng tôi đã giải quyết vấn đề này với 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

Mặc dù câu trả lời @BC là tốt nhất để in một trang.

Nhưng Để in nhiều trang có kích thước A4 cùng một lúc với ctrl + P, giải pháp sau đây có thể giúp ích.

@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
  • Mở một cửa sổ mới
  • Mở đối tượng tài liệu của cửa sổ mới và viết vào đó một tài liệu đơn giản không chứa gì ngoài div bạn đã có và tiêu đề html cần thiết, v.v. - bạn cũng có thể muốn có tài liệu kéo trong biểu định kiểu, tùy thuộc vào nội dung của bạn là
  • Đặt một tập lệnh trong trang mới để gọi window.print ()
  • Kích hoạt kịch bản

2

Đây là plugin in jquery của tôi

(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

Nếu bạn muốn có tất cả các kiểu từ tài liệu gốc (bao gồm cả kiểu nội tuyến), bạn có thể sử dụng phương pháp này.

  1. Sao chép tài liệu đầy đủ
  2. Thay thế phần thân bằng phần tử bạn muốn in.

Thực hiện:

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
Tôi không biết rằng đây là giải pháp tốt nhất, nhưng nó hoạt động hoàn hảo. Cảm ơn!
BRogers

Nếu nó hoạt động, nó phải là tốt nhất :)
Stefan Norberg

2

Lưu ý: Điều này chỉ hoạt động với các trang web hỗ trợ jQuery

Nó rất đơn giản với thủ thuật tuyệt vời này. Nó hoạt động với tôi trong trình duyệt Google Chrome . Firefox sẽ không cho phép bạn in ra PDF mà không cần plugin.

  1. Đầu tiên, mở trình kiểm tra bằng cách sử dụng (Ctrl + Shift + I) / (Cmd + Tùy chọn + I).
  2. Nhập mã này trong bảng điều khiển:

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. Nó khởi chạy hộp thoại in. In một bản in vật lý hoặc lưu nó vào PDF (bằng chrome). Làm xong!

Logic rất đơn giản. Chúng tôi đang tạo một thẻ script mới và gắn nó ở phía trước của thẻ body đóng. Chúng tôi đã thêm một phần mở rộng in jQuery vào HTML. Thay đổi myDivWithStyles bằng ID thẻ Div của riêng bạn. Bây giờ nó quan tâm đến việc chuẩn bị một cửa sổ ảo có thể in được.

Hãy thử nó trên bất kỳ trang web. Chỉ có cảnh báo đôi khi CSS được viết khéo léo có thể gây ra thiếu kiểu. Nhưng chúng tôi nhận được nội dung hầu hết các lần.


1

Trong Opera, hãy thử:

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

1

Đây là một giải pháp IFrame hoạt động cho IE và 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

Đã tạo một cái gì đó chung chung để sử dụng trên bất kỳ phần tử HTML nào

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

Hi vọng điêu nay co ich.


1

Tôi đã sửa đổi câu trả lời @BillPaetski để sử dụng querySelector, thêm CSS tùy chọn, xóa thẻ H1 bắt buộc và đặt tiêu đề tùy ý hoặc được kéo từ cửa sổ. Nó cũng không tự động in thêm nữa và hiển thị nội bộ để chúng có thể được tắt trong chức năng trình bao bọc hoặc theo ý muốn.

Hai vars riêng duy nhất là tmpWindow và tmpDoc mặc dù tôi tin rằng tiêu đề, truy cập css và elem có thể thay đổi nên tất cả các đối số chức năng là riêng tư.

Mã số:
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;
}
Sử dụng:
DOMPrinter = PrintElem('#app-container');
DOMPrinter.print();

Ngoài ra, nó không sao chép các giá trị của các <input>yếu tố. Làm thế nào tôi có thể sử dụng cái này bao gồm cả những gì người dùng đã gõ?
Malcolm Salvador

@ Malky.Kid hãy suy nghĩ về những gì bạn đang hỏi. Nếu bạn muốn in một mẫu, bạn cần phải treo các sự kiện mờ trên các yếu tố hình thức, và thiết lập giá trị thuộc tính, chọn, mặc định và innerText của <input>, <select>, <textarea>compontents là giá trị thời gian chạy của họ. Có những lựa chọn thay thế, nhưng đó không phải là vấn đề với tập lệnh này, mà là vấn đề về cách trình duyệt hoạt động và lấy innerHTMLtài sản của tài liệu với đầu vào, khung vẽ, v.v.
MrMesees 22/07/17

Tôi đã đi đến một giải pháp thông qua .attr('value',). Tôi thậm chí đã thực hiện nó cho textarea (bằng cách nối thêm) và các hộp kiểm ( .attr('checked',)). Tôi xin lỗi nếu tôi không nghĩ đủ về những gì tôi đang hỏi.
Malcolm Salvador

Muốn chia sẻ với cả lớp? có thể là một ý chính hoặc một cái gì đó trong các ý kiến. Tôi sẽ nâng cao nó.
MrMesees

0

Đoạn mã dưới đây sao chép tất cả các nút có liên quan được chọn bởi bộ chọn truy vấn, sao chép các kiểu của chúng như được thấy trên màn hình, vì nhiều phần tử cha được sử dụng để nhắm mục tiêu các bộ chọn css sẽ bị thiếu. Điều này gây ra một chút độ trễ nếu có rất nhiều nút con với rất nhiều kiểu.

Lý tưởng nhất là bạn đã có sẵn một tờ kiểu in, nhưng đây là cho các trường hợp sử dụng khi không có bảng định kiểu in nào được chèn và bạn muốn in như nhìn thấy trên màn hình.

Nếu bạn sao chép các mục bên dưới trong bảng điều khiển trình duyệt trên trang này, nó sẽ in tất cả các đoạn mã trên trang này.

+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

Đây thực sự là một bài viết cũ nhưng đây là một bản cập nhật của tôi những gì tôi đã thực hiện bằng cách sử dụng câu trả lời đúng. Giải pháp của tôi cũng sử dụng jQuery.

Điểm của điều này là sử dụng chế độ xem in phù hợp, bao gồm tất cả các bảng định kiểu cho định dạng phù hợp và cũng được hỗ trợ trong hầu hết các trình duyệt.

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

Sau này bạn đơn giản cần một cái gì đó như thế này:

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

Thử nó.


-1

Tương tự như câu trả lời hay nhất, chỉ trong trường hợp bạn cần in hình ảnh như tôi đã làm:

Trong trường hợp bạn muốn in hình ảnh:

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

Bạn đang thiếu một loadsự kiện trên cửa sổ bật lên. Nếu không có nó, bạn sẽ in một trang trống vì hình ảnh không được tải. =>$(popup).load(function(){ popup.focus(); popup.print(); });
Tim Vermaelen

-4

Cách tốt nhất để làm điều đó là gửi nội dung của div đến máy chủ và mở một cửa sổ mới nơi máy chủ có thể đưa những nội dung đó vào cửa sổ mới.

Nếu đó không phải là một tùy chọn, bạn có thể thử sử dụng ngôn ngữ phía máy khách như javascript để ẩn mọi thứ trên trang ngoại trừ div đó và sau đó in trang ...


1
Không cần phải trả lại cho máy chủ. Bạn có thể mở một cửa sổ trình duyệt và đặt nội dung và gọi lệnh in.
Jonathon Faust

Bạn có thể tạo một cửa sổ mới từ máy khách.
Mũi nhọn

1
Jonathon: Tôi thích giải pháp đó. Bạn có mã ví dụ nào không?
hữu ích nhất vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.