DIV içeriğini yazdırma


336

Bir DIV içeriğini yazdırmanın en iyi yolu nedir?


Yazdır elemanını burada
Gabe

1
Baskı ile ne demek istiyorsun? Fiziksel bir yazıcıda olduğu gibi?
Yuriy Faktorovich

Yazıcıda olduğu gibi "yazdır" mı? veya belgeye?
Ed Schembor


3
Tıpkı bir div basma sorusuna bir çözüm aramaya çalışan herkes için bir referans olarak. Aşağıdaki yanıtı çok yararlı buldum: stackoverflow.com/a/7532581/405117
Vikram

Yanıtlar:


518

Önceki sürüme göre küçük değişiklikler - CHROME üzerinde test edildi

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
Bu hızlı bir çözümdür. İdeal çözüm, yazdırma için ayrı bir CSS kullanmaktır. Belki de probleminizin ayrıntılarını (gereksinimlerini) ayrıntılandırabilirsiniz.
Bill Paetzke

6
Açılır pencerede stil sayfasına başvurabilirsiniz. <head> etiketleri arasına başka bir kod satırı ekleyin: mywindow.document.write ('<link rel = "stylesheet" href = "main.css" type = "text / css" />');
Bill Paetzke

5
@Rahil bunu şu şekilde değiştirin: mywindow.document.close (); mywindow.focus (); ) (mywindow.print; ) (mywindow.close;
ROFLwTIME

3
^ add newwindow.focus (); çapraz tarayıcı yazdırmayı etkinleştirmek için.
JackMahoney

7
Bazen baskı önizleme yüklenemezse, belki de yazdırılacak içerik oldukça büyük olduğunda (aynı sayfa Firefox'ta mükemmel yazdırırken Chrome ile fark ettim, ancak Firefox'ta veya diğer tarayıcılarda da olabileceğini hariç tutmuyorum). Bulduğum en iyi yol, yalnızca pencereler yüklendikten sonra baskıyı çalıştırmak (ve kapatmak). Sonra: Bunu mywindow.document.write(data);ekleyin: mywindow.document.write('<script type="text/javascript">$(window).load(function() { window.print(); window.close(); });</script>');Ve kaldırın: mywindow.print();vemywindow.close();
Fabius

164

Bence daha iyi bir çözüm var. Div'inizin yazdırılmasını tüm belgeyi kapsayacak şekilde yapın, ancak yalnızca yazdırıldığında:

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

Mükemmel, bir pop-up daha güzel.
GreenWebDev

5
Ne yazık ki, IE'de beklendiği gibi çalışmaz,
şuna

16
Birden çok sayfaya taşması gereken içerik Chrome'da kısaltılmış görünüyor.
Ishmael Smyrnow

IE'de belgenin geri kalanını gizlemeniz gerekir. Yukarıdaki gibi değişiklik yapmak şu şekilde çalışır: @media print {body * {display: none; } .myDivToPrint {display: block; arka plan rengi: beyaz; yükseklik: 100%; genişlik:% 100; pozisyon: sabit; üst: 0; sol: 0; kenar boşluğu: 0; dolgu: 15 piksel; yazı tipi boyutu: 14 piksel; satır yüksekliği: 18 piksel; }}
RonnBlack

2
Z-endeksi koymanız gerekebilir: 9999999; daha yüksek konumlandırılmış başka elemanlarınız olması durumunda.
Adam M.

43

Bu @gabe tarafından söylenmiş olsa da , jQuery kullanıyorsanız printElementeklentimi kullanabilirsiniz .

Orada bir örnek var burada eklentisi hakkında daha fazla bilgi ve burada .

Kullanımı oldukça basittir, sadece bir jQuery seçiciyle bir öğe alın ve yazdırın:

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

Umut ediyorum bu yardım eder!


14
8 yıl sonra bu .browser çağrı jquery 1.9 kaldırılmıştır çünkü "a.browser tanımsız" üretecek
KingsInnerSoul

1
@KingsInnerSoul jQuery kullanıcıları ile o kadar kaba olmuyor, bu zamanlar onlar için yeterince sert; p
Alexandre Daubricourt

22

Jquery kullanarak bu işlevi kullanın:

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

Yazdır düğmeniz aşağıdaki gibi görünecektir:

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

Düzenleme: Tutmanız gereken form verileriniz varsa, klon bunu kopyalamaz, bu yüzden tüm form verilerini almanız ve geri yükledikten sonra değiştirmeniz gerekir:

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

$ ( 'body') html (restorepage).; çalışmaz çünkü o sırada vücut elemanı yoktur. bu nedenle yerini location.reload () ile değiştirmek daha iyi olacaktır;
Hata Ayıklayıcı

Hayır. Sayfayı yeniden yüklerseniz formlardaki bilgileri veya orada bulunması gerekebilecek diğer ayarları silmiş olursunuz. Mükemmel çalışıyor. Koda bakmak için zaman ayırırsanız, var geri yükleme sayfasının değiştirmeyi yapmak için tüm sayfa bilgilerine sahip olduğunu görürsünüz. Kodumu düzenlemeye çalışmayı bırakın ve ya kendiniz için test edin ya da işlevin her bir bölümünün ne yaptığını öğrenin.
Gary Hayes

Bu daha iyi. Hala başlık vb. Css bağlantıları koymak gerekir yukarıda belirtilenlerin aksine yazdırma sırasında sayfa tasarımı içerir. Teşekkürler!
Jorz

geçtiğiniz yol elkorkunç, özellikle jQ kullandığınızdan beri. Basitçe geçmek selectorve sabit kodlanmış kurtulmak için çok daha iyi#
RozzA

Her zaman bu yöntemi kullandım bugün android cihazda (Google Chrome) düzgün çalışmadığını fark ettim. Sayfanın yazdırılabilir alanı her seferinde değişir ve içinde bazı ekstra parçalar bulunur el. Bence vücut geri yüklenirken print komutu gönderiliyor.
Ali Sheikhpour

18

Buradan 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 öğesini 2 parçaya bölmek için bir modifikasyon gerekir. çünkü brwoser geçerli sayfanın ana sonu olarak "</body>" kullanır. var footstr1 = "</"; var footstr2 = "gövde>"; var footerstr = footstr1 + footstr12;
mirzaei

13

Bill Paetzkediv içeren resimler yazdırmak için cevap kullandım ama google chrome ile çalışmadı

Ben sadece çalışması için bu satırı eklemek gerekiyordu myWindow.onload=function(){ve işte tam kod

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

ayrıca birisinin kimliğine sahip bir div yazdırması gerekiyorsa jquery yüklemesine gerek yoktur

İşte bunu yapmak için saf javascript kodu

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

umarım bu birine yardımcı olabilir


Bu benim için çalıştı! Orijinal cevap "mywindow" ve "myWindow" u kullandığından deve beni ısırdı. Teşekkürler!
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;
}

Bu, divistediğiniz alanı yazdırır ve içeriği olduğu gibi ayarlar. printdivnameolduğu divbasılabilir.


footerStr öğesini 2 parçaya bölmek için bir modifikasyon gerekir. çünkü brwoser geçerli sayfanın ana sonu olarak "</body>" kullanır. var footstr1 = "</"; var footstr2 = "gövde>"; var footerstr = footstr1 + footstr12;
mirzaei

Bu ustaca! Ama evet, mirzaei'den hack'e ihtiyacınız var, aksi takdirde vücut etiketi kırılıyor ve biçimlendirmenin kırılması. Kesmek ile, bu harika çalışıyor! Özel baskı stillerini kolaylaştırmak için kendi iç ambalajınızı da ekleyebilirsiniz. Bu kabul edilen cevap olmalı.
user2662680

9

Yazdırmak istediğiniz içerik dışındaki diğer tüm öğeleri gizleyen ayrı bir baskı stil sayfası oluşturun. Yüklediğinizde kullanarak işaretleyin 'media="print":

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

Bu, çıktılar için tamamen farklı bir stil sayfasına sahip olmanızı sağlar.

Tarayıcının yazdırma iletişim kutusunu sayfa için görünmeye zorlamak istiyorsanız, JQuery'yi kullanarak yükleme sırasında bunu şu şekilde yapabilirsiniz:

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

veya bir kullanıcının bir düğmeyi tıklaması gibi istediğiniz başka bir etkinliğin tetiklenmesi.


2
Evet bu da işe yarar; senaryonun tam olarak ne olduğunu bilmek zor.
Sivri

Ayrı bir CSS'nin ideal çözüm olduğunu kabul ediyorum. Div'in içeriğini yeni bir pencereye kopyalamak hızlı bir çözümdür.
Bill Paetzke

9

Şimdiye kadar önerilen çözümlerin aşağıdaki dezavantajları olduğunu düşünüyorum:

  1. CSS ortam sorgusu çözümleri, yazdırılacak tek bir div olduğunu varsayar.
  2. Javascript çözümleri yalnızca belirli tarayıcılarda çalışır.
  3. Üst pencere içeriğini yok etmek ve yeniden yaratmak karışıklık yaratır.

Yukarıdaki çözümleri geliştirdim. Test ettiğim, aşağıdaki faydalarla gerçekten iyi çalışan bir şey.

  1. IE, Chrome, Safari ve firefox dahil tüm tarayıcılarda çalışır.
  2. Üst pencereyi yok etmez ve yeniden yüklemez.
  3. Bir sayfada istediğiniz sayıda DIV yazdırabilir.
  4. Hataya yatkın dize birleştirmesini önlemek için html şablonlarını kullanır.

Dikkat edilmesi gereken önemli noktalar:

  1. Yeni oluşturulan pencerede onload = "window.print ()" olmalıdır.
  2. Üst öğeden targetwindow.close () veya targetwindow.print () öğesini çağırmayın.
  3. Targetwindow.document.close () ve target.focus () işlevlerini yaptığınızdan emin olun.
  4. Ben jquery kullanıyorum ama aynı tekniği düz javascript kullanarak da yapabilirsiniz.
  5. Bunu http://math.tools/table/multiplication adresinde görebilirsiniz . Kutu başlığındaki yazdır düğmesine tıklayarak her bir tabloyu ayrı ayrı yazdırabilirsiniz.

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


Bu mükemmel ve çapraz tarayıcı kabul edilen sonuçlardan çok daha iyi çalıştı!
dama_do_bling

7

Bu senaryo için bir eklenti yazdım. Orada eklentilerden memnun kalmadım ve daha kapsamlı / yapılandırılabilir bir şey yapmak için yola çıktım.

https://github.com/jasonday/printThis


1
Sıkı çalışman için çok teşekkürler Jason ..... !! Gerçekten daha fazla projemde kullanacağım. Ne zihin üfleme eklentisi adam ......

6

Kabul edilen çözüm işe yaramıyordu. Chrome, resmi zamanında yüklemediği için boş bir sayfa yazdırıyordu. Bu yaklaşım işe yarar:

Edit: Görünüşe göre kabul edilen çözüm yazıma sonra değiştirildi. Neden inişli çıkışlı? Bu çözüm de işe yarıyor.

    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

Bu eski bir soru olduğunu biliyorum, ama w jQuery bu sorunu çözdü.

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 yanıtı tek bir sayfa yazdırmak için en iyisi olmasına rağmen.

Ancak A4 boyutunda birden çok sayfayı aynı anda yazdırmak için ctrl + P ile aşağıdaki çözüm yardımcı olabilir.

@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
  • Yeni bir pencere aç
  • Yeni pencerenin belge nesnesini açın ve içine div ve gerekli html üstbilgisi vb. Dışında hiçbir şey içermeyen basit bir belge yazın. Ayrıca, içeriğinize bağlı olarak belgenin bir stil sayfasında çekilmesini de isteyebilirsiniz.
  • Window.print () öğesini çağırmak için yeni sayfaya bir komut dosyası yerleştirin
  • Komut dosyasını tetikle

2

İşte benim jquery baskı eklentisi

(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

Orijinal belgedeki tüm stillerin (satır içi stiller dahil) olmasını istiyorsanız bu yaklaşımı kullanabilirsiniz.

  1. Belgenin tamamını kopyala
  2. Gövdeyi, yazdırmak istediğiniz öğeyle değiştirin.

Uygulama:

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
Bunun en iyi çözüm olduğunu bilmiyorum, ama mükemmel çalıştı. Teşekkürler!
BRogers

2

Not: Bu yalnızca jQuery özellikli sitelerle çalışır

Bu harika hile ile çok basit. Benim için Google Chrome tarayıcısında çalıştı . Firefox, eklenti olmadan PDF'ye yazdırmanıza izin vermez.

  1. İlk olarak, (Ctrl + Shift + I) / (Cmd + Option + I) kullanarak denetçiyi açın.
  2. Konsola bu kodu yazı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. Yazdır iletişim kutusunu başlatır. Fiziksel bir baskı alın veya PDF'ye (krom) kaydedin. Bitti!

Mantık basit. Yeni bir komut dosyası etiketi oluşturuyor ve bunu gövde etiketinin kapanışının önüne ekliyoruz. HTML'ye bir jQuery baskı uzantısı enjekte ettik. Değişim myDivWithStyles Kendi Div etiket kimliğiyle. Şimdi yazdırılabilir bir sanal pencere hazırlamak önemlidir.

Herhangi bir sitede deneyin. Sadece ihtar bazen hileli bir şekilde yazılır CSS stil eksikliğine neden olabilir. Ancak içeriği çoğu zaman alıyoruz.


1

Opera'da şunları deneyin:

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

1

IE ve Chrome için çalışan bir IFrame çözümü:

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

Herhangi bir HTML öğesinde kullanılacak genel bir şey oluşturdu

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

Bu yardımcı olur umarım.


1

QuerySelector kullanmak, isteğe bağlı CSS eklemek, zorla H1 etiketini kaldırmak ve isteğe bağlı olarak belirtilmiş veya pencereden çekilmiş başlık yapmak için @BillPaetski yanıtını değiştirdim. Ayrıca artık otomatik olarak yazdırmaz ve içleri açığa çıkarır, böylece sarma işlevinde veya istediğiniz gibi kapatılabilirler.

Başlık, css ve elem erişiminin değişebileceğine inandığım halde, sadece iki özel değişken tmpWindow ve tmpDoc.

Kod:
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;
}
Kullanımı:
DOMPrinter = PrintElem('#app-container');
DOMPrinter.print();

Ayrıca, <input>öğelerin değerlerini kopyalamaz . Kullanıcının yazdıkları da dahil olmak üzere bunu nasıl kullanabilirim?
Malcolm Salvador

@ Malky.Kid lütfen ne istediğini düşün. Bir formu yazdırmak istiyorsanız, form elemanları bulanıklık olayları kanca ve özellik değeri seçilmiş, varsayılan ve innerText ayarlamanız gerekir <input>, <select>, <textarea>compontents onların çalışma zamanı değeri olarak. Alternatifler var, ancak bu komut dosyasıyla ilgili bir sorun değil, tarayıcıların nasıl çalıştığı ve innerHTMLgirdiler, tuval vb.
İçeren

Zaten üzerinden bir çözüme ulaştım .attr('value',). Hatta textarea (ekleyerek) ve onay kutuları ( .attr('checked',)) için yaptım . Ben üzgün ben ne sorduğunu hakkında yeterli düşünmüyordum eğer.
Malcolm Salvador

Sınıfla paylaşmak ister misiniz? belki yorumlarda bir şey ya da bir şey. Onu yok edeceğim.
MrMesees

0

Aşağıdaki kod, sorgu seçici tarafından hedeflenen tüm ilgili düğümleri kopyalar, ekranda görüldüğü gibi stillerinin üzerine kopyalar, çünkü css seçicilerini hedeflemek için kullanılan birçok üst öğe eksik olacaktır. Çok fazla stile sahip çok sayıda çocuk düğümü varsa, bu biraz gecikmeye neden olur.

İdeal olarak, bir baskı stili sayfanız hazır olacaktır, ancak bu, eklenecek baskı stili sayfasının olmadığı ve ekranda görüldüğü gibi yazdırmak istediğiniz durumlar içindir.

Bu sayfadaki tarayıcı konsolunda aşağıdaki öğeleri kopyalarsanız, bu sayfadaki tüm kod snippet'leri yazdırılır.

+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

Bu gerçekten eski yazı ama işte benim doğru cevap kullanarak yaptığım güncellemem. Benim çözümüm de jQuery kullanıyor.

Bunun amacı, uygun yazdırma görünümünü kullanmak, uygun biçimlendirme için tüm stil sayfalarını dahil etmek ve ayrıca çoğu tarayıcıda desteklenmektir.

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

Daha sonra böyle bir şeye ihtiyacınız var:

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

Dene.


-1

En iyi cevapla aynı, sadece yaptığım gibi görüntüyü yazdırmanız gerekiyorsa:

Görüntü yazdırmak istiyorsanız:

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

loadAçılır pencerede bir etkinlik eksik . Bu olmadan, görüntü yüklenmediği için boş bir sayfa basarsınız. =>$(popup).load(function(){ popup.focus(); popup.print(); });
Tim Vermaelen

-4

Bunu yapmanın en iyi yolu, div içeriğini sunucuya göndermek ve sunucunun bu içeriği yeni pencereye yerleştirebileceği yeni bir pencere açmak olacaktır.

Bu bir seçenek değilse, bu div dışında sayfadaki her şeyi gizlemek ve ardından sayfayı yazdırmak için javascript gibi bir istemci tarafı dili kullanmayı deneyebilirsiniz ...


1
Sunucuya geri dönmeye gerek yok. Bir tarayıcı penceresi açabilir ve içindekileri ayarlayabilir ve yazdırma komutunu çağırabilirsiniz.
Jonathon Faust

İstemciden yeni bir pencere oluşturabilirsiniz.
Sivri

1
Jonathon: Bu çözümü seviyorum. Örnek kodunuz var mı?
usertest
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.