2009-10-30 22 views
6

Próbuję wydrukować zawartość iframe.Drukowanie elementów iframe w przeglądarce Opera i Chrome

contentWindow.focus(); 
contentWindow.print(); 

Ten kod działa w IE, Firefox i Safari. Ale nie działają w Chrome i Operze. Te przeglądarki drukują całą stronę.

Próbowałem użyć tego tematu How do I print an IFrame from javascript in Safari/Chrome. Ale to mi nie pomogło.

Czy ktoś mógłby mi pomóc?

+0

Od połączonego artykułu wydaje się, że przynajmniej dla Chrome należy mieć powodzenie. Czy element iframe znajduje się w innej domenie? – Paul

+0

Nie. Pochodzi z tej samej domeny. –

Odpowiedz

4

Jest to znany błąd w Operze. W uzupełnieniu do powyższych pomysłów na obejściach, można bawić się z czymś takim:

var clone=document.documentElement.cloneNode(true) 
    var win=window.open('about:blank'); 
    win.document.replaceChild(clone, win.document.documentElement); 
    win.print(); 

Nie przetestowane, ale powinna utworzyć kopię strony w osobnym oknie i wydrukować, bez konieczności aby załadować zawartość po raz drugi z serwera lub utracić modyfikacje DOM, które mogą być wydrukowane.

2

Jak rozumiem, niemożliwe jest wdrożenie drukowania ramki iframe bez otwierania nowego okna.

Moja funkcja druku:

if ($.browser.opera || (/chrome/.test(navigator.userAgent.toLowerCase()))) { 
    var href = contentWindow.location.href; 
    href = href.indexOf("?") > -1 ? href + "&print=1" : href + "?print=1"; 
    var printWindow = window.open(href, "printWindow", "scrollbars=yes"); 
    printWindow.focus(); 
} 
else { 
    contentWindow.focus(); 
    contentWindow.print(); 
} 

także dodałem poniższy kod na końcu korpusu (po druk == 1):

<script type='text/javascript'> 
    function invokePrint() { 
    if (document.readyState && document.readyState!='complete') 
     setTimeout(function() { invokePrint(); }, 50); 
    else if (document.body && document.body.innerHTML=='false') 
     setTimeout(function() { invokePrint(); }, 50); 
    else { 
     focus(); 
     print(); 
    } 
    } 
    invokePrint(); 
</script> 
1

I nie można odtworzyć problemu z Chrome. Opera jednak nadal drukuje całą zewnętrzną stronę, próbując tylko wydrukować element iframe.

Opracowałem obejście problemu i chociaż działa głównie, nie jest w 100% bezpieczne (między innymi dlatego, że Opera zawija linie do drukowania, nie wiem jak obliczyć prawidłową wysokość w takich przypadkach). Powiedział, że poniższy kod działa co najmniej rozsądne (przy użyciu jQuery dla wygody):

if ($.browser.opera) { 
    var ifr  = $('#youriframe'); 
    var ifrbody = ifr.get(0).contentDocument.body; 
    var sheet = $([ 
     '<style type="text/css" media="print">', 
     'body * {', 
     ' display: none;', 
     '}', 
     '#youriframe {', 
     ' border: none;', 
     ' display: block;', 
     ' height: ', ifrbody.scrollHeight, 'px;', 
     ' margin: 0px;', 
     ' padding: 0px;', 
     ' width: ', ifrbody.scrollWidth, 'px;', 
     '}', 
     '<\/style>' 
    ].join('')); 
    $('head').append(sheet); 
    window.print(); 
    sheet.remove(); 
} 

Nadzieja to pomaga.

0

Próbowałem powyżej kodzie i po wprowadzeniu zmian w powyższych kodów przyszedłem z kodem rozstrzygającego następująco

var win=window.open('about:blank'); 
win.document.write('<html><head></head><body>'); 
win.document.write('<iframe frameBorder="0" align="center" src="'+window.location.href+'" onload="test()" style="width: 619px; height: 482px;"></iframe>'); 
win.document.write('<scr'+'ipt>function test(){window.focus();window.print()}</sc'+'ript></body></html>'); 
win.document.close(); 
if (window.focus) {win.focus()} 

próbować ten jeden

Powiązane problemy