2009-10-30 14 views
6

Estoy tratando de imprimir el contenido del iframe.Imprimir el contenido del iframe en Opera y Chrome

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

Este código funciona en IE, Firefox y Safari. Pero no trabaje en Chrome y Opera. Estos navegadores imprimen toda la página.

He intentado utilizar este tema How do I print an IFrame from javascript in Safari/Chrome. Pero no me ayudó.

¿Alguien podría ayudarme?

+0

Desde el artículo enlazado parece que, al menos para Chrome que debe tener éxito. Es el iframe en un dominio diferente? – Paul

+0

No. Es del mismo dominio. –

Respuesta

4

Este es un error conocido en Opera. Además de las ideas anteriores para soluciones, es posible que desee jugar con algo como esto:

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

No he probado esto, pero debe crear una copia de la página en una ventana emergente e imprimirlo, sin tener para cargar el contenido por segunda vez desde el servidor o perder cualquier modificación DOM que desee imprimir.

2

Según tengo entendido, es imposible implementar la impresión de iframe sin abrir una nueva ventana.

Mi función de impresión:

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

También he añadido el código siguiente al final del cuerpo (cuando la impresión == 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

No puedo reproducir su problema con Chrome. Sin embargo, Opera todavía imprime toda la página externa cuando intenta imprimir solo el iframe.

He ideado una solución y, aunque funciona principalmente, no es 100% a prueba de errores (entre otros porque Opera enrolla las líneas para la impresión; no sé cómo calcular la altura correcta en esos casos). Dicho esto, el siguiente código funciona al menos razonable (utilizando jQuery para mayor comodidad):

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

Espero que esto ayude.

0

me trataron por encima de código y después de hacer cambios en los códigos anteriores Vine con código concluyentes de la siguiente manera

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

prueba este

Cuestiones relacionadas