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();
}
to strona nadrzędna i strona w ramce w tej samej domenie? –
tak, faktycznie iframe jest pusty piszę treść do niego – user1083382