Chỉ in <div id = phiên bản printarea> </ div>?


444

Làm cách nào để in div được chỉ định (mà không tắt thủ công tất cả nội dung khác trên trang)?

Tôi muốn tránh hộp thoại xem trước mới, vì vậy việc tạo một cửa sổ mới với nội dung này không hữu ích.

Trang này chứa một vài bảng, một trong số chúng chứa div tôi muốn in - bảng được tạo kiểu với các kiểu trực quan cho web, không nên hiển thị khi in.


1
stackoverflow.com/questions/2255291/ từ liên kết này hoạt động hoàn hảo
Jinna Balu

Câu trả lời:


792

Đây là một giải pháp chung, chỉ sử dụng CSS mà tôi đã xác minh để hoạt động.

@media print {
  body * {
    visibility: hidden;
  }
  #section-to-print, #section-to-print * {
    visibility: visible;
  }
  #section-to-print {
    position: absolute;
    left: 0;
    top: 0;
  }
}

Phương pháp thay thế không tốt lắm. Sử dụng displaylà khó khăn bởi vì nếu bất kỳ yếu tố nào có display:nonethì con cháu của nó sẽ không hiển thị. Để sử dụng nó, bạn phải thay đổi cấu trúc trang của bạn.

Sử dụng visibilityhoạt động tốt hơn vì bạn có thể bật khả năng hiển thị cho con cháu. Các yếu tố vô hình vẫn ảnh hưởng đến bố cục, vì vậy tôi di chuyển section-to-printlên trên cùng bên trái để nó in đúng.


21
Đây là cách nhanh nhất và sạch nhất, tôi tự hỏi tại sao câu trả lời này không nhận được nhiều phiếu bầu nhất -.-
Dany Khalife

34
Một vấn đề cần chú ý với giải pháp này là bạn có thể in hàng ngàn trang trống trong một số trường hợp. Trong trường hợp của tôi, tôi đã có thể giải quyết vấn đề này bằng cách sử dụng một số màn hình bổ sung: không có kiểu dáng nào cho các mục được chọn nhưng có lẽ có thể đạt được một giải pháp tổng quát hơn bằng cách kết hợp cả việc buộc độ cao, tràn: không và định vị tuyệt đối cho tất cả các div hoặc thứ gì đó.
Malcolm MacLeod

5
Đây là một khởi đầu tuyệt vời nhưng tôi đã gặp phải hai rắc rối với nó: vì một nếu bất kỳ cha mẹ của thành phần nào thiết lập định vị tương đối / tuyệt đối của riêng mình thì nội dung vẫn sẽ được bù trừ trừ khi tôi sử dụng position:fixedthay thế. Tuy nhiên, Chrome và Safari cũng sẽ cắt bớt nội dung, đặc biệt là sau trang đầu tiên. Vì vậy, cách giải quyết cuối cùng của tôi là đặt cả mục tiêu tất cả các bậc cha mẹ của nó đếnoverflow:visible; position:absolute !important; top:0;left:0
natevw

1
@ dudeNumber4 #section-to-printkhớp với chính phần đó; #section-to-print *phù hợp với từng yếu tố phụ của phần. Vì vậy, quy tắc đó chỉ làm cho phần và tất cả nội dung của nó hiển thị.
Bennett McElwee

3
Bạn có thể thử một giải pháp JavaScript, nhưng nó sẽ không hoạt động nếu người dùng của bạn sử dụng lệnh In của trình duyệt.
Bennett McElwee

243

Tôi có một giải pháp tốt hơn với mã tối thiểu.

Đặt phần có thể in của bạn bên trong div với id như thế này:

<div id="printableArea">
      <h1>Print me</h1>
</div>

<input type="button" onclick="printDiv('printableArea')" value="print a div!" />

Sau đó thêm một sự kiện như onclick (như được hiển thị ở trên) và truyền id của div như tôi đã làm ở trên.

Bây giờ hãy tạo một javascript thực sự đơn giản:

function printDiv(divName) {
     var printContents = document.getElementById(divName).innerHTML;
     var originalContents = document.body.innerHTML;

     document.body.innerHTML = printContents;

     window.print();

     document.body.innerHTML = originalContents;
}

Chú ý điều này đơn giản như thế nào? Không có cửa sổ bật lên, không có cửa sổ mới, không có kiểu dáng điên rồ, không có thư viện JS như jquery. Vấn đề với các giải pháp thực sự phức tạp (câu trả lời không phức tạp và không phải là điều tôi đang đề cập) là thực tế là nó sẽ KHÔNG BAO GIỜ dịch trên tất cả các trình duyệt! Nếu bạn muốn làm cho các kiểu khác nhau, hãy làm như thể hiện trong câu trả lời đã chọn bằng cách thêm thuộc tính media vào liên kết biểu định kiểu (media = "print").

Không có lông tơ, nhẹ, nó chỉ hoạt động.


@Kevin tôi thử mẫu này cho mẫu nhưng nó in mẫu trống (không có dữ liệu) và tôi cần một mẫu đã điền trước khi gửi
Arif

98
@asprin cảnh báo! Đây không phải là mã miễn phí lộn xộn. Sử dụng InternalHTML để xóa sạch sau đó tạo lại toàn bộ cơ thể là tốt cho các trang đơn giản, nhưng với các tùy chỉnh nâng cao hơn (menu, trình chiếu, v.v.), nó có thể xóa một số hành vi động được thêm bởi các tập lệnh khác.
Barshe

17
Giải pháp này sẽ không hoạt động trong bất kỳ trang phức tạp nào, nơi các phần tử trong vùng có thể in phụ thuộc vào kiểu và / hoặc vị trí của phần tử cha. Nếu bạn trích xuất div có thể in, nó có thể trông hoàn toàn khác vì tất cả các phụ huynh hiện đang thiếu.
Andrei Volgin

1
Đáng buồn là Chrome không hoạt động tốt nếu bạn đóng cửa sổ Xem trước bản in sau đó thử thực hiện jQuery .click. Thật là xấu hổ, bởi vì mã rất nhẹ.
rybo111

3
@BorisGappov một ví dụ rất đơn giản chỉ với một sự kiện nhấp chuột để chứng minh quan điểm của tôi: jsfiddle.net/dc7voLzt Tôi sẽ nói lại: đây không phải là mã không lộn xộn! Vấn đề không nằm ở bản in, đó là về việc khôi phục trang gốc!
Barshe

121

Tất cả các câu trả lời cho đến nay đều khá thiếu sót - chúng hoặc liên quan đến việc thêm class="noprint"vào mọi thứ hoặc sẽ gây rối displaytrong #printable.

Tôi nghĩ rằng giải pháp tốt nhất sẽ là tạo một trình bao bọc xung quanh những thứ không thể in được:

<head>
    <style type="text/css">

    #printable { display: none; }

    @media print
    {
        #non-printable { display: none; }
        #printable { display: block; }
    }
    </style>
</head>
<body>
    <div id="non-printable">
        Your normal page contents
    </div>

    <div id="printable">
        Printer version
    </div>
</body>

Tất nhiên điều này không hoàn hảo vì nó liên quan đến việc di chuyển mọi thứ trong HTML của bạn một chút ...


Tôi nghĩ bạn đã đúng, nhưng làm cách nào để giết kiểu dáng của bảng xung quanh div (nếu có thể loại bỏ kiểu dáng - tôi có thể in bảng và loại trừ phần còn lại của nội dung khá dễ dàng
noesgard

Tôi sử dụng Javascript để chọn nội dung cần thiết và CSS như trên
noesgard

9
Tôi thích sử dụng HTML ngữ nghĩa. Định dạng in nên được xử lý bằng CSS. Xem câu trả lời của tôi để biết cách thực hiện việc này: stackoverflow.com/questions/468881/
Kẻ

Đồng ý với Bennett, sử dụng khả năng hiển thị thay vì hiển thị là một giải pháp sạch hơn nhiều
guigouz

Tôi đã thực hiện một giải pháp thực sự đơn giản ở mức thấp hơn trong chủ đề này mà tôi nghĩ sẽ phù hợp với nhu cầu của người hỏi hơn. Nó không dựa vào biểu định kiểu in, có thể được tái chế trên tất cả các trang web của bạn và rất nhẹ.
Kevin Florida

108

Với jQuery, nó đơn giản như thế này:

w=window.open();
w.document.write($('.report_left_inner').html());
w.print();
w.close();

3
Điều này khá thú vị, mặc dù nó xuất hiện trong Chrome dưới dạng một cửa sổ bật lên bị chặn.
Rafi Jacoby

8
mẹo là gọi nó trong sự kiện do người dùng tạo, chẳng hạn như khi nhấp chuột. bạn cũng có thể thêm sau dòng đầu tiên: if (! w) alert ('Vui lòng bật cửa sổ bật lên');
romaninsh

1
có ai đã làm việc này trên IE11 chưa? Nó chỉ cần mở một cửa sổ sau đó đóng nó ngay lập tức. Hoạt động trong Chrome, FF và safari mặc dù.
greatwitenorth 6/07/2015

3
Tôi bị mất css trong khi in với điều này, có cách nào để duy trì css không?
Moxet Khan

2
@MoxetKhan, bài này có một giải pháp với css vevlo.com/how-to-print-div-content-using-javascript
lakesare

22

Bạn có thể sử dụng biểu định kiểu in và sử dụng CSS để sắp xếp nội dung bạn muốn in không? Đọc bài viết này để biết thêm con trỏ.


Tôi có một biểu định kiểu in - cố gắng tránh đặt quy tắc kiểu trong tất cả các nội dung khác ...
noesgard

Tôi có một bảng có kiểu dáng trên, tương ứng với div trong câu hỏi, Nếu tôi đặt bảng để hiển thị: không - tôi vẫn có thể hiển thị div chứ?
noesgard

Tôi nghĩ là có, và bạn có thể thử đánh dấu quy tắc là quan trọng để thúc đẩy nó!
Paul Dixon

nếu bảng không được hiển thị, nó sẽ không thành vấn đề ngay cả khi div được đặt thành 'display: awesome;'. Cha mẹ được giấu và con cái cũng vậy. Đây có phải là một tình huống mà bạn cần một bảng hoặc nó chỉ dành cho bố cục trang?
roborourke

"Bùng nổ, headshot!" bằng cách bố trí bảng. = |
ANeves

19

Điều này hoạt động tốt:

<style type="text/css">
@media print
{
body * { visibility: hidden; }
#printcontent * { visibility: visible; }
#printcontent { position: absolute; top: 40px; left: 30px; }
}
</style>

Lưu ý rằng điều này chỉ hoạt động với "tầm nhìn". "Hiển thị" sẽ không làm điều đó. Đã thử nghiệm trong FF3.


15

Tôi thực sự không thích bất kỳ câu trả lời nào trong số này. Nếu bạn có một lớp (giả sử printableArea) và có lớp học đó ngay lập tức, thì bạn có thể làm một cái gì đó như thế này trong CSS in của bạn:

body > *:not(.printableArea) {
    display: none;
}

//Not needed if already showing
body > .printableArea {
    display: block;
}

Đối với những người tìm kiếm printableArea ở một nơi khác, bạn sẽ cần đảm bảo rằng cha mẹ của printableArea được hiển thị:

body > *:not(.parentDiv),
.parentDiv > *:not(.printableArea) {
    display: none;
}

//Not needed if already showing
body > .printableArea {
    display: block;
}

Sử dụng khả năng hiển thị có thể gây ra nhiều vấn đề về khoảng cách và các trang trống. Điều này là do khả năng hiển thị duy trì không gian các phần tử, chỉ làm cho nó bị ẩn đi, nơi mà màn hình sẽ loại bỏ nó và cho phép các phần tử khác chiếm không gian của nó.

Lý do tại sao giải pháp này hoạt động là bạn không nắm bắt được tất cả các yếu tố, chỉ là những đứa trẻ ngay lập tức của cơ thể và che giấu chúng. Các giải pháp khác bên dưới với màn hình css, ẩn tất cả các yếu tố, ảnh hưởng đến mọi thứ bên trong nội dung printableArea.

Tôi sẽ không đề xuất javascript vì bạn sẽ cần có một nút in mà người dùng nhấp và các nút in trình duyệt tiêu chuẩn sẽ không có tác dụng tương tự. Nếu bạn thực sự cần phải làm điều đó, những gì tôi sẽ làm là lưu trữ html của phần thân, loại bỏ tất cả các phần tử không mong muốn, in, sau đó thêm html trở lại. Như đã đề cập, tôi sẽ tránh điều này nếu bạn có thể và sử dụng tùy chọn CSS như trên.

LƯU Ý: Bạn có thể thêm bất kỳ CSS nào vào CSS in bằng các kiểu nội tuyến:

<style type="text/css">
@media print {
   //styles here
}
</style>

Hoặc như tôi thường sử dụng là một thẻ liên kết:

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

Điều gì sẽ xảy ra nếu div bạn muốn in không phải là "đứa con ngay lập tức"? Tôi đang cố gắng làm điều này trong vue.js .. Nhưng tôi nhận được rất nhiều trang trống khi sử dụng câu trả lời được chấp nhận.
svenema

@svenema, bạn có thể sử dụng bất kỳ CSS nào bạn muốn. Đây chỉ là một ví dụ.
fanfavorite

hmm, vẫn vậy, khi tôi thử cái này, thực sự không có trang trống nào nữa, nhưng div printableArea cũng không hiển thị; Tôi chỉ có 1 trang trống khi tôi sử dụng mã này.
svenema

Tôi phát hiện ra rằng đó thực sự là vì div printableArea không phải là con trực tiếp của thẻ body, khi tôi biến nó thành con trực tiếp, giải pháp của bạn hoạt động; tuy nhiên, trong trường hợp của tôi, tôi không thể biến printableArea thành con trực tiếp. Có cách nào để giái quyết vấn đề này không?
svenema

@svenema, vui lòng xem chỉnh sửa của tôi ở trên.
fanfavorite

8
  1. Cho bất cứ yếu tố nào bạn muốn in id printMe.

  2. Bao gồm tập lệnh này trong thẻ đầu của bạn:

    <script language="javascript">
        var gAutoPrint = true;
    
        function processPrint(){
    
        if (document.getElementById != null){
        var html = '<HTML>\n<HEAD>\n';
        if (document.getElementsByTagName != null){
        var headTags = document.getElementsByTagName("head");
        if (headTags.length > 0) html += headTags[0].innerHTML;
        }
    
        html += '\n</HE' + 'AD>\n<BODY>\n';
        var printReadyElem = document.getElementById("printMe");
    
        if (printReadyElem != null) html += printReadyElem.innerHTML;
        else{
        alert("Error, no contents.");
        return;
        }
    
        html += '\n</BO' + 'DY>\n</HT' + 'ML>';
        var printWin = window.open("","processPrint");
        printWin.document.open();
        printWin.document.write(html);
        printWin.document.close();
    
        if (gAutoPrint) printWin.print();
        } else alert("Browser not supported.");
    
        }
    </script>
  3. Gọi hàm

    <a href="javascript:void(processPrint());">Print</a>

Đây là một công việc tốt. Nhưng cách quá phức tạp và sẽ không hoạt động đúng trình duyệt chéo (đặc biệt là các trình duyệt cũ hơn). Tôi đề nghị bạn hãy xem giải pháp của tôi dưới đây.
Kevin Florida

6

hm ... sử dụng loại biểu mẫu để in ... ví dụ:

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

in.css:

div { display: none; }
#yourdiv { display: block; }

Điều này sẽ không hoạt động nếu tài liệu không dựa trên DIV hoặc #yourdiv cũng bao gồm các DIV khác.
Gumbo

#yourdiv * {display: ...} nếu bạn đặt trên đầu trang và có một trình duyệt up-to-date bạn có thể sau đó làm việc với nhiều bộ chọn để ẩn đi không divs
Andreas Niedermair

"#yourdiv * {display: ...}" - ... nên làm gì mà không phá vỡ bố cục?
Greg

Điều này sẽ hiển thị các yếu tố nội tuyến cũng như các yếu tố khối. Nhưng mà #yourdiv, #yourdiv div {display: block} thì sẽ làm được.
Gumbo

@dittodhole - hãy suy nghĩ về nó trong một phút. Những gì bạn có thể đặt vào đó sẽ không phá vỡ bố cục trong #yourdiv?
Greg

6
<script type="text/javascript">
   function printDiv(divId) {
       var printContents = document.getElementById(divId).innerHTML;
       var originalContents = document.body.innerHTML;
       document.body.innerHTML = "<html><head><title></title></head><body>" + printContents + "</body>";
       window.print();
       document.body.innerHTML = originalContents;
   }
</script>


6
nhìn đẹp nhưng bạn mất tất cả các ràng buộc javascript và khác sau khi in
Julien

1
Đó là in mà không có css.
Moxet Khan

6

Bước 1: Viết javascript sau trong thẻ head của bạn

<script language="javascript">
function PrintMe(DivID) {
var disp_setting="toolbar=yes,location=no,";
disp_setting+="directories=yes,menubar=yes,";
disp_setting+="scrollbars=yes,width=650, height=600, left=100, top=25";
   var content_vlue = document.getElementById(DivID).innerHTML;
   var docprint=window.open("","",disp_setting);
   docprint.document.open();
   docprint.document.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"');
   docprint.document.write('"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');
   docprint.document.write('<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">');
   docprint.document.write('<head><title>My Title</title>');
   docprint.document.write('<style type="text/css">body{ margin:0px;');
   docprint.document.write('font-family:verdana,Arial;color:#000;');
   docprint.document.write('font-family:Verdana, Geneva, sans-serif; font-size:12px;}');
   docprint.document.write('a{color:#000;text-decoration:none;} </style>');
   docprint.document.write('</head><body onLoad="self.print()"><center>');
   docprint.document.write(content_vlue);
   docprint.document.write('</center></body></html>');
   docprint.document.close();
   docprint.focus();
}
</script>

Bước 2: Gọi hàm PrintMe ('DivID') bằng một sự kiện onclick.

<input type="button" name="btnprint" value="Print" onclick="PrintMe('divid')"/>
<div id="divid">
here is some text to print inside this div with an id 'divid'
</div>

Đây là một trong những! Đã sử dụng nó cho một Modal và Gallery. Không có lỗi Javascript sau khi đóng. Thực sự hữu ích đặc biệt khi bạn sử dụng các chế độ dài hơn một trang. Kết thúc tốt đẹp nó. Hoàn hảo cho những người muốn in để lưu trữ.
TheWeeezel

2

Với CSS 3, bạn có thể sử dụng như sau:

body *:not(#printarea) {
    display: none;
}

Không thể sử dụng mà tôi sợ ... (sửa tôi nếu sai) trang tôi đang làm việc là asp.net 1.1 / DHTML
noesgard

Nó phụ thuộc vào trình duyệt xem bộ chọn: not () đã có sẵn hay chưa.
Gumbo

Vâng, đó là đề xuất của tôi chỉ là một cái nhìn vào tương lai, Không. Tôi chỉ đề cập đến nó cho sự hoàn chỉnh. Tôi biết rằng nó không thể thực hiện ngay bây giờ. Không may.
Gumbo

Bạn có thể sử dụng jQuery và bộ chọn này (tôi nghĩ) sẽ hoạt động trong IE6 - $ ('body *: not (#printarea)'). Style ('display', 'none');
David Heggie

2
điều này sẽ ẩn tất cả hậu duệ của #printarea, vì chúng được khớp bởi *: not (#printarea). Vì vậy, về cơ bản, bạn kết thúc với một container rỗng.
cytofu

2

Tôi đã chọn nội dung bằng JavaScript và tạo một cửa sổ mà tôi có thể in thay thế ...


Bạn có thể chia sẻ mã này không, nó có vấn đề về việc áp dụng css
Moxet Khan

2

Phương pháp của Sandro hoạt động rất tốt.

Tôi đã điều chỉnh nó để cho phép cho phép nhiều liên kết printMe, đặc biệt được sử dụng trong các trang được gắn thẻ và mở rộng văn bản.

function processPrint(printMe){ <- gọi cho một biến ở đây

var printReadyElem = document.getElementById(printMe); <- xóa các trích dẫn xung quanh printMe để yêu cầu một biến

<a href="javascript:void(processPrint('divID'));">Print</a><- truyền ID div sẽ được in vào hàm để biến biến printMe thành ID div. trích dẫn duy nhất là cần thiết


2

printDiv (divId) : Một giải pháp tổng quát để in bất kỳ div nào trên bất kỳ trang nào.

Tôi có một vấn đề tương tự nhưng tôi muốn (a) có thể in toàn bộ trang, hoặc (b) in bất kỳ một trong một số khu vực cụ thể. Giải pháp của tôi, nhờ phần lớn những điều trên, cho phép bạn chỉ định bất kỳ đối tượng div nào sẽ được in.

Chìa khóa cho giải pháp này là thêm một quy tắc phù hợp vào biểu định kiểu phương tiện in để div được yêu cầu (và nội dung của nó) sẽ được in.

Đầu tiên, tạo css in cần thiết để triệt tiêu mọi thứ (nhưng không có quy tắc cụ thể để cho phép phần tử bạn muốn in).

<style type="text/css" media="print">
   body {visibility:hidden; }
   .noprintarea {visibility:hidden; display:none}
   .noprintcontent { visibility:hidden; }
   .print { visibility:visible; display:block; }
</style>

Lưu ý rằng tôi đã thêm các quy tắc lớp mới:

  • noprintarea cho phép bạn ngăn chặn việc in các phần tử trong div- cả nội dung và khối.
  • noprintcontent cho phép bạn ngăn chặn việc in các phần tử trong nội dung của bạn - nội dung bị chặn nhưng khu vực được phân bổ bị bỏ trống.
  • in cho phép bạn có các mục hiển thị trong phiên bản in nhưng không có trên trang màn hình. Chúng thường sẽ có "display: none" cho kiểu màn hình.

Sau đó chèn ba hàm JavaScript. Việc đầu tiên chỉ đơn giản là bật và tắt biểu định kiểu phương tiện in.

function disableSheet(thisSheet,setDisabled)
{ document.styleSheets[thisSheet].disabled=setDisabled; }   

Thứ hai thực hiện công việc thực sự và thứ ba làm sạch sau đó. Thứ hai (printDiv) kích hoạt biểu định kiểu phương tiện in, sau đó thêm quy tắc mới để cho phép div mong muốn in, phát hành bản in và sau đó thêm độ trễ trước khi vệ sinh cuối cùng (nếu không thì có thể đặt lại kiểu trước khi thực sự in làm xong.)

function printDiv(divId)
{
  //  Enable the print CSS: (this temporarily disables being able to print the whole page)
  disableSheet(0,false);
  //  Get the print style sheet and add a new rule for this div
  var sheetObj=document.styleSheets[0];  
  var showDivCSS="visibility:visible;display:block;position:absolute;top:30px;left:30px;";
  if (sheetObj.rules) { sheetObj.addRule("#"+divId,showDivCSS); }
  else                { sheetObj.insertRule("#"+divId+"{"+showDivCSS+"}",sheetObj.cssRules.length); }
  print();
  //  need a brief delay or the whole page will print
  setTimeout("printDivRestore()",100);  
}

Các chức năng cuối cùng xóa quy tắc đã thêm và đặt lại kiểu in thành vô hiệu hóa để toàn bộ trang có thể được in.

function printDivRestore()
{
  // remove the div-specific rule
  var sheetObj=document.styleSheets[0];  
  if (sheetObj.rules) { sheetObj.removeRule(sheetObj.rules.length-1); }
  else                { sheetObj.deleteRule(sheetObj.cssRules.length-1); }
  //  and re-enable whole page printing
  disableSheet(0,true);
}

Điều khác duy nhất cần làm là thêm một dòng vào quá trình xử lý tải của bạn để kiểu in ban đầu bị vô hiệu hóa do đó cho phép in toàn bộ trang.

<body onLoad='disableSheet(0,true)'>

Sau đó, từ bất cứ nơi nào trong tài liệu của bạn, bạn có thể in một div. Chỉ cần phát hành printDiv ("thedivid") từ một nút hoặc bất cứ điều gì.

Một điểm cộng lớn cho phương pháp này là nó cung cấp một giải pháp chung để in nội dung được chọn từ trong một trang. Nó cũng cho phép sử dụng các kiểu hiện có cho các thành phần được in - bao gồm cả div chứa.

LƯU Ý: Trong triển khai của tôi, đây phải là biểu định kiểu đầu tiên. Thay đổi các tham chiếu trang tính (0) thành số trang thích hợp nếu bạn cần thực hiện sau trong trình tự trang tính.


2

@Kevin Florida Nếu bạn có nhiều div với cùng một lớp, bạn có thể sử dụng nó như thế này:

 <div style="display:none">
   <div id="modal-2" class="printableArea">
     <input type="button" class="printdiv-btn" value="print a div!" />
   </div>
 </div>

tôi đã sử dụng loại nội dung bên trong Colorbox

$(document).on('click', '.printdiv-btn', function(e) {
    e.preventDefault();

    var $this = $(this);
    var originalContent = $('body').html();
    var printArea = $this.parents('.printableArea').html();

    $('body').html(printArea);
    window.print();
    $('body').html(originalContent);
});

2

Trong trường hợp của tôi, tôi đã phải in một hình ảnh trong một trang. Khi tôi sử dụng giải pháp đã bỏ phiếu, tôi có 1 trang trống và trang còn lại hiển thị hình ảnh. Hy vọng nó sẽ giúp được ai đó.

Đây là css tôi đã sử dụng:

@media print {
  body * {
    visibility: hidden;
  }

  #not-print * {
    display: none;
  }

  #to-print, #to-print * {
    visibility: visible;
  }

  #to-print {
    display: block !important;
    position: absolute;
    left: 0;
    top: 0;
    width: auto;
    height: 99%;
  }
}

Html của tôi là:

<div id="not-print" >
  <header class="row wrapper page-heading">

  </header>

  <div class="wrapper wrapper-content">
    <%= image_tag @qrcode.image_url,  size: "250x250" , alt: "#{@qrcode.name}" %>
  </div>
</div>

<div id="to-print" style="display: none;">
  <%= image_tag @qrcode.image_url,  size: "300x300" , alt: "#{@qrcode.name}" %>
</div>

2

Css tốt nhất để phù hợp với không gian trống chiều cao:

@media print {
  body * {
    visibility: hidden;
    height:0;
  }
  #section-to-print, #section-to-print * {
    visibility: visible;
    height:auto;
  }
  #section-to-print {
    position: absolute;
    left: 0;
    top: 0;
  }
}

2

Cách tốt nhất để in Div cụ thể hoặc bất kỳ yếu tố nào

printDiv("myDiv");

function printDiv(id){
        var printContents = document.getElementById(id).innerHTML;
        var originalContents = document.body.innerHTML;
        document.body.innerHTML = printContents;
        window.print();
        document.body.innerHTML = originalContents;
}

1

Sử dụng Biểu định kiểu đặc biệt để in

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

và sau đó thêm một lớp tức là "noprint" vào mỗi thẻ mà bạn không muốn in.

Trong CSS sử dụng

.noprint {
  display: none;
}

1

Nếu bạn chỉ muốn in div này, bạn phải sử dụng hướng dẫn:

@media print{
    *{display:none;}
    #mydiv{display:block;}
}

1

Hàm printDiv () xuất hiện một vài lần, nhưng trong trường hợp đó, bạn mất tất cả các yếu tố ràng buộc và giá trị đầu vào. Vì vậy, giải pháp của tôi là tạo một div cho mọi thứ gọi là "body_allin" và một div khác ngoài cái đầu tiên gọi là "body_print".

Sau đó, bạn gọi chức năng này:

function printDiv(divName){

    var printContents = document.getElementById(divName).innerHTML;

    document.getElementById("body_print").innerHTML = printContents;

    document.getElementById("body_allin").style.display = "none";
    document.getElementById("body_print").style.display = "";

    window.print();

    document.getElementById("body_print").innerHTML = "";
    document.getElementById("body_allin").style.display = "";
    document.getElementById("body_print").style.display = "none";

}

Dòng này có thể hữu ích nếu bạn muốn id duy nhất: printContents = printContents.replace (/ id = ("| ') (. *?) (" |') / G, 'id = $ 1 $ 2_2 $ 3');
pmrotule

1

Bạn có thể sử dụng một kiểu CSS riêng biệt để vô hiệu hóa mọi nội dung khác ngoại trừ kiểu có id "printarea".

Xem Thiết kế CSS: Đi đến In để biết thêm giải thích và ví dụ.


Cập nhật liên kết đến vị trí mới. Một bình luận thay vì một downvote sẽ là tốt đẹp.
Kosi2801

1

Tôi đã có nhiều hình ảnh với một nút và cần phải bấm vào một nút để in mỗi div với một hình ảnh. Giải pháp này hoạt động nếu tôi đã tắt bộ nhớ cache trong trình duyệt của mình và kích thước hình ảnh không thay đổi trong 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;
    }

<div id="printableArea">
      <h1>Print me</h1>
</div>

<input type="button" onclick="printDiv('printableArea')" value="print a div!" />

1

Thêm một lần phê duyệt mà không ảnh hưởng đến trang hiện tại và nó cũng duy trì css trong khi in. Ở đây bộ chọn phải là bộ chọn div cụ thể mà chúng tôi cần in.

printWindow(selector, title) {
   var divContents = $(selector).html();
   var $cssLink = $('link');
   var printWindow = window.open('', '', 'height=' + window.outerHeight * 0.6 + ', width=' + window.outerWidth  * 0.6);
   printWindow.document.write('<html><head><h2><b><title>' + title + '</title></b></h2>');
   for(var i = 0; i<$cssLink.length; i++) {
    printWindow.document.write($cssLink[i].outerHTML);
   }
   printWindow.document.write('</head><body >');
   printWindow.document.write(divContents);
   printWindow.document.write('</body></html>');
   printWindow.document.close();
   printWindow.onload = function () {
            printWindow.focus();
            setTimeout( function () {
                printWindow.print();
                printWindow.close();
            }, 100);  
        }
}

Ở đây cung cấp một số thời gian ra cho thấy rằng css bên ngoài được áp dụng cho nó.


CSS đôi khi mất thời gian để tải, cách tiếp cận này là những gì tôi đang tìm cách tải lại trang trước khi in. Cảm ơn
Arpit Shrivastava

1

Tôi đã thử nhiều giải pháp được cung cấp. Một trong số chúng hoạt động hoàn hảo. Chúng hoặc mất các ràng buộc CSS hoặc JavaScript. Tôi đã tìm thấy một giải pháp hoàn hảo và dễ dàng mà không làm mất các ràng buộc CSS và JavaScript.

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>

Javascript:

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

Việc mở và tạo một cửa sổ khác không hoạt động trên Android. Chỉ cửa sổ trực tiếp.print () hoạt động.
Merv

1

Tôi đến bữa tiệc này rất muộn, nhưng tôi muốn tham gia với một cách tiếp cận khác. Tôi đã viết một mô-đun JavaScript nhỏ gọi là PrintElements để in động các phần của trang web.

Nó hoạt động bằng cách lặp qua các phần tử nút được chọn và với mỗi nút, nó đi qua cây DOM cho đến phần tử BODY. Ở mỗi cấp độ, bao gồm cấp độ ban đầu (là cấp độ của nút được in), nó sẽ gắn một lớp đánh dấu ( pe-preserve-print) vào nút hiện tại. Sau đó gắn một lớp đánh dấu khác ( pe-no-print) cho tất cả anh chị em của nút hiện tại, nhưng chỉ khi không có pe-preserve-printlớp nào trên chúng. Như một hành động thứ ba, nó cũng gắn một lớp khác với các yếu tố tổ tiên được bảo tồnpe-preserve-ancestor .

Một css chỉ in bổ sung đơn giản sẽ ẩn và hiển thị các phần tử tương ứng. Một số lợi ích của phương pháp này là tất cả các kiểu được bảo tồn, nó không mở một cửa sổ mới, không cần phải di chuyển xung quanh nhiều yếu tố DOM và nói chung nó không xâm lấn với tài liệu gốc của bạn.

Xem bản demo , hoặc đọc bài viết liên quan để biết thêm chi tiết .



0

Tôi tìm thấy giải pháp.

@media print {
    .print-area {
        background-color: white;
        height: 100%;
        width: auto;
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
        z-index:1500;
        visibility: visible;
    }
    @page{
        size: portrait;
        margin: 1cm;
    }
/*IF print-area parent element is position:absolute*/
    .ui-dialog,
    .ui-dialog .ui-dialog-content{
        position:unset !important;
        visibility: hidden;
    }
}

0

dựa trên câu trả lời của @Kevin Florida, tôi đã thực hiện một cách để tránh tập lệnh trên trang hiện tại bị vô hiệu hóa do nội dung ghi đè. Tôi sử dụng tập tin khác gọi là "printScreen.php" (hoặc .html). Bao bọc mọi thứ bạn muốn in trong một "printSource" div. Và với javascript, hãy mở một cửa sổ mới mà bạn đã tạo trước đó ("printScreen.php") sau đó lấy nội dung trong "printSource" của cửa sổ trên cùng.

Đây là mã.

Cửa sổ chính :

echo "<div id='printSource'>";
//everything you want to print here
echo "</div>";

//add button or link to print
echo "<button id='btnPrint'>Print</button>";

<script>
  $("#btnPrint").click(function(){
    printDiv("printSource");
  });

  function printDiv(divName) {
   var printContents = document.getElementById(divName).innerHTML;
   var originalContents = document.body.innerHTML;
   w=window.open("printScreen.php", "_blank", "toolbar=yes,scrollbars=yes,resizable=yes,top=50,left=50,width=900,height=400");
   }
</script>

Đây là "printScreen.php" - tệp khác để lấy nội dung cần in

<head>
// write everything about style/script here (.css, .js)

</head>
<body id='mainBody'></body>
</html>


<script>
    //get everything you want to print from top window
    src = window.opener.document.getElementById("printSource").innerHTML;

    //paste to "mainBody"
    $("#mainBody").html(src);
    window.print();
    window.close();
</script>
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.