2012-03-08 2 views
48

To jest mój kodJavascript Drukuj zawartość iframe tylko

<script> 
var body = "dddddd"  
var script = "<script>window.print();</scr'+'ipt>"; 

var newWin = $("#printf")[0].contentWindow.document; 
newWin.open(); 
newWin.close(); 

$("body",newWin).append(body+script); 

</script> 
<iframe id="printf"></iframe> 

To działa, ale drukuje stronę nadrzędną, jak mogę go wydrukować tylko iframe?

+0

to strona nadrzędna i strona w ramce w tej samej domenie? –

+0

tak, faktycznie iframe jest pusty piszę treść do niego – user1083382

Odpowiedz

87

nie spodziewałbym się, że do pracy

spróbować zamiast

window.frames["printf"].focus(); 
window.frames["printf"].print(); 

i używać

<iframe id="printf" name="printf"></iframe> 

Ewentualnie spróbuj stary dobry

var newWin = window.frames["printf"]; 
newWin.document.write('<body onload="window.print()">dddd</body>'); 
newWin.document.close(); 

jeśli jQuery nie można siekać

Live Demo

+0

Cześć dzięki użyłem twojej pierwszej opcji i działało idealnie – user1083382

+3

Używałem jQuery i znalazłem te same metody przez obiekt Dom. tj. 'var iframe = $ ('# printf') [0]; iframe.contentWindow.focus(); iframe.contentWindow.print(); 'Czy to działa w IE 9 lub niższym? – gawpertron

+5

Od 1/22/2014 nie działa to w Chrome, niezależnie od tego, czy dodasz contentWindow czy zadzwonisz window.frames ["printf"]. Print(). Drukuje całą stronę, a nie tylko ramkę. – Gullbyrd

6

alternatywnym rozwiązaniem, które mogą lub nie mogą być odpowiednie, ale czystsze jeśli jest to:

Jeśli zawsze chcesz po prostu wydrukować iframe ze strony, można mieć osobne " @media print {} "arkusz stylów, który ukrywa wszystko oprócz elementu iframe. Następnie możesz po prostu wydrukować stronę normalnie.

9
document.getElementById("printf").contentWindow.print()​​​​​​; 

Same origin policy dotyczy.

9

Łatwy sposób (testowane na IE7 +, Firefox, Chrome, Safari) byłoby to

//id is the id of the iframe 
function printFrame(id) { 
      var frm = document.getElementById(id).contentWindow; 
      frm.focus();// focus on contentWindow is needed on some ie versions 
      frm.print(); 
      return false; 
} 
+3

działa tylko w Chrome dla mnie. Byłem tak pewien, że to zadziała! – user158017

4

miałem problemy z wszystkich powyższych rozwiązań w IE8, znaleźli godnego obejścia, która jest testowana w IE 8 +9, Chrome, Safari i Firefox. Dla mojej sytuacji i niezbędne do wydrukowania raportu, które zostały wygenerowane dynamicznie:

// create content of iframe 
var content = '<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">'+ 
'<head><link href="/css/print.css" media="all" rel="stylesheet" type="text/css"></head>'+ 
'<body>(rest of body content)'+ 
'<script type="text/javascript">function printPage() { window.focus(); window.print();return; }</script>'+ 
'</body></html>'; 

Zanotować printpage() JavaScript metoda przed organizmie blisko tag.

Następny utworzyć iframe i dołączyć go do organu nadrzędnego więc jego contentWindow jest dostępny:

var newIframe = document.createElement('iframe'); 
newIframe.width = '0'; 
newIframe.height = '0'; 
newIframe.src = 'about:blank'; 
document.body.appendChild(newIframe); 

Następny ustawić zawartość:

newIframe.contentWindow.contents = content; 
newIframe.src = 'javascript:window["contents"]'; 

Tutaj jesteśmy ustawienie dynamicznej zmiennej treści do obiekt okna iframe, a następnie wywołujący go za pomocą javascript: scheme.

Wreszcie do wydrukowania; skupić iframe i wywołać funkcję w treści iframe javascript printPage():

newIframe.focus(); 
setTimeout(function() { 
    newIframe.contentWindow.printPage(); 
}, 200); 
return; 

setTimeout nie jest koniecznie potrzebne, jednak jeśli jesteś ładowania dużych ilości treści znalazłem Chrome czasami nie drukować bez niego tak ten krok jest zalecany. Alternatywą jest zawijanie "newIframe.contentWindow.printPage();" w próbie przechwyć i umieść owiniętą wersję setTimeout w bloku catch.

Mam nadzieję, że to pomoże komuś, ponieważ spędziłem dużo czasu na znalezieniu rozwiązania, które działało dobrze w wielu przeglądarkach. Dzięki SpareCycles.

EDIT:

Zamiast używania setTimeout do wywołania funkcji printPage użyć następujących:

newIframe.onload = function() { 
    newIframe.contentWindow.printPage(); 
} 
+0

Naprawdę myślałem, że to zadziała. Ale nie działa dla mnie w żadnej przeglądarce. :( – user158017

+0

to działa dobrze dla mnie, w jaki sposób mogę pomóc? Opublikuj/wyślij mi swój kod i zajrzyj do niego, lub spójrz na przykład, gdzie im go używa: [DIYInvestor] (http: // www. diyinvestor.co.uk/compare/) przechodzi przez stronę porównawczą 1, jej implementacja zakończyła się powodzeniem na ikonie drukowania nad tabelą wyników: –

+0

@ user158017, proszę sprawdzić moją EDYCJĘ powyżej - czy ta pomoc? Jestem świadomy dość długi czas przeszedł .. –

0

Jeśli ustawienie zawartości ramki IFrame za pomocą javascript document.write() następnie należy zamknąć dokument newWin.document.close(); W przeciwnym razie poniższy kod nie będzie działał, a drukowanie wydrukuje zawartość całej strony, a nie tylko zawartość ramki IFrame.

var frm = document.getElementById(id).contentWindow; 
frm.focus();// focus on contentWindow is needed on some ie versions 
frm.print(); 
4

Można użyć tego polecenia:

document.getElementById('iframeid').contentWindow.print(); 

Polecenie to w zasadzie to samo, co window.print(), ale za oknem chcielibyśmy wydrukować jest w iframe, musimy najpierw aby uzyskać wystąpienie tego okna jako obiektu javascript.

W odniesieniu do tego elementu iframe, najpierw uzyskujemy element iframe, używając jego id, a następnie contentWindow zwraca obiekt window (DOM). Tak więc jesteśmy w stanie bezpośrednio użyć funkcji window.print() na tym obiekcie.

+0

Witam, Witaj w Stackoverflow.Please dodaj trochę informacji na temat odpowiedzi lub [spójrz tutaj] (http://stackoverflow.com/help/how-to-answer) –

+0

Podczas gdy ten blok kodu może odpowiedzieć pytanie byłoby lepszą odpowiedzią, gdyby można było wyjaśnić, dlaczego tak się dzieje. – DavidPostill

3

W tej chwili nie ma potrzeby umieszczania znacznika skryptu wewnątrz elementu iframe. Działa to dla mnie (przetestowane w Chrome, Firefox, IE11 i węzła-WebKit 0,12):

<script> 
window.onload = function() { 
    var body = 'dddddd'; 
    var newWin = document.getElementById('printf').contentWindow; 
    newWin.document.write(body); 
    newWin.document.close(); //important! 
    newWin.focus(); //IE fix 
    newWin.print(); 
} 
</script> 

<iframe id="printf"></iframe> 

Dzięki wszystkim odpowiedzi, zapisać mój dzień.

-1

Zastanawiam się, jaki jest twój cel wykonania wydruku iframe.

Podobny problem spotkałem przed chwilą: użyj podglądu wydruku chrome, aby wygenerować plik PDF iframe.

końcu rozwiązać mój problem z trick:

$('#print').click(function() { 
 
    $('#noniframe').hide(); // hide other elements 
 
    window.print();   // now, only the iframe left 
 
    $('#noniframe').show(); // show other elements again. 
 
});

0

użyć tego kodu do IE9 i powyżej:

window.frames["printf"].focus(); 
window.frames["printf"].print(); 

Dla IE8:

window.frames[0].focus(); 
window.frames[0].print();