2009-05-06 15 views
15

Ho una pagina con un elenco di collegamenti e un div che funge da segnaposto per le pagine a cui i collegamenti conducono. Ogni volta che un utente fa clic su un link, un iframe viene creato nel div e il suo attributo src ottiene il valore dell'attributo href del link - semplice e chiaro, una sorta di galleria di pagine web esterne. Quello che ho un problema con è la stampa del contenuto dell'iframe. Per fare questo io uso questo codice:Stampa del contenuto di un iframe creato dinamicamente dalla finestra padre

 
function PrintIframe() 
{ 
frames["name"].focus(); 
frames["name"].print(); 
} 

Il problema sembra essere che iframe viene creato dinamicamente da JQuery - quando inserisco un iframe a destra il codice html, il browser stampa la pagina esterna tutto a posto. Ma con lo stesso codice iniettato da JavaScript non succede nulla. Ho provato a utilizzare l'evento "live" di JQ 1.3 sul collegamento "Stampa", senza successo. C'è un modo per superare questo?

risposta

26

Supponiamo che questo è ciò che il vostro iframe assomiglia :

<iframe id='print-iframe' name='print-frame-name'></iframe> 

questo è come si fa utilizzando jQuery:

$("#print-iframe").get(0).contentWindow.print(); 

e questo è come si fa u cantare JavaScript native:

document.getElementById("print-iframe").contentWindow.print(); 
+4

+ 1 per 'contentWindow' –

0

Hmm ho capito bene? Hai solo bisogno di cambiare la fonte di dove porta l'IFrame?

$("#iframe").attr("src", "http://www.example.com"); 
+0

no, il problema è che non riesco a stampare la pagina nel iframe - ci sono 2 opzioni: 1) è possibile stampare come una parte della pagina (con Plugin PrintArea) - ma poi stampa solo una pagina e il contenuto della pagina ifram non è formattato come dovrebbe. 2) è possibile stamparlo come una normale pagina ma SOLO se il tag iframe non è inserito dinamicamente, tramite JS ma presenta staticamente in HTML. – certainlyakey

0

Forse la stessa limitazione del dominio impedisce l'esecuzione del codice JavaScript. La restrizione dello stesso dominio consente a JavaScript nel frame A (o alla finestra principale) di interagire (come .print()) con il frame B se A e B appartengono allo stesso dominio. Controlla la tua console di errore JavaScript. Se si ottiene qualcosa come un'eccezione di sicurezza/errore di autorizzazione, allora è molto probabilmente a causa della restrizione dello stesso dominio.

+0

No, non ho errori di questo tipo in Firebug ... E sì, le pagine provengono tutte dallo stesso dominio. – certainlyakey

7

Ho provato questo ed è stato in grado di replicare il problema. Quello che ho notato è che quando si chiama la funzione di stampa l'iframe non è stato completato. ho provato questo verificando il valore di innerHTML quando si chiama PrintIFrame(). Per ovviare a questo, è possibile utilizzare setTimeOut per chiamare la funzione di nuovo x Mostra millisecondi dopo:

function PrintIframe() { 

     if (window.frames['myname'].innerHTML != "") { 
      window.frames['myname'].focus(); 
      window.frames['myname'].print(); 
     } else { 
      setTimeout(PrintIframe,1000); 
     }  
    } 

Questo ha funzionato per me

EDIT Strano - ho avuto un avviso nel mio codice di prova che sembra fare funziona. Quando l'ho tirato fuori, non ha funzionato. Ci dispiace :(

In ogni caso, questo dovrebbe farlo utilizzando jQuery per collegare un gestore di eventi carico al iframe ho testato su IE8 e funziona:.

<html> 
<head> 
    <script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
    <script type="text/javascript"> 
    function loadiFrame(src) 
    { 
     $("#iframeplaceholder").html("<iframe id='myiframe' name='myname' src='" + src + "' />"); 
    } 

    $(function() 
    { 
     $("#printbutton").bind("click", 
      function() { 
       loadiFrame('test.aspx'); 
       $("#myiframe").load( 
        function() { 
         window.frames['myname'].focus(); 
         window.frames['myname'].print(); 
        } 
       ); 
      } 
     ); 
    }); 
    </script>  
</head> 
<body> 
    <input type="button" id="printbutton" value="Load iFrame" /> 
    <div id="iframeplaceholder"></div> 
</body> 
</html> 
+0

Non per me :(Ancora una volta, è ok con html ma non stampa un iframe se è stato creato da JQ stesso. – certainlyakey

+0

Beh, la tua ultima elaborazione ha funzionato per me sulla pagina di test, dovrebbe approfondire ... – certainlyakey

0
var ifrm = document.createElement("iframe"); 
// ifrm.style.display = "none"; 
document.body.appendChild(ifrm); 
setTimeout(function() { 
    $(ifrm).contents().find("body").html("my html content"); 
}, 1); 
ifrm.onload = function() { 
    ifrm.contentWindow.print(); 
} 
0

ho trovato questo la ricerca sul Web

$('#preview-iframe').contents().find('html').html(data); 

e cambiato per

$('#preview-iframe').contents().find('html').html(data).after(function() { 
    document.getElementById("preview-iframe").contentWindow.print(); 
}); 

twigstechtips

8

Ho avuto un problema con il stampa del contenuto di iframe.Al fine di raggiungere questo obiettivo, utilizzare il codice qui sotto:

Per esempio si hanno iframe:

<iframe id='print-iframe' name='print-iframe'></iframe> 

JS Poi stampare chiamata contenuti iframe questa funzione (funziona sia in IE e altri browser):

printIframe('print-iframe'); 
codice

di funzione:

function printIframe(iFrameId) { 
    var ua = window.navigator.userAgent; 
    var msie = ua.indexOf ("MSIE "); 
    var iframe = document.getElementById(printFrameId); 

    if (msie !== 0) { 
     iframe.contentWindow.document.execCommand('print', false, null); 
    } else { 
     iframe.contentWindow.print(); 
    } 
} 
+0

Questo sembra funzionare bene, tuttavia, penso che sia meglio controllare (msie> -1). –

+0

Questo è solo un semplice controllo :) La fonte è: http://support.microsoft.com/ kb/167820 –

+0

Funziona solo per una volta. Se faccio di nuovo clic sul pulsante, ricevo un "Errore di runtime JavaScript: Accesso negato". Sto cercando di stampare in silenzio un documento pdf. Ho una tabella con più voci e ogni voce può essere "stampata". Quando si fa clic sul pulsante di stampa della voce, lo src dell'iframe viene aggiornato con il nuovo url e il codice precedente viene eseguito per stamparlo silenziosamente. Come ho detto, funziona una volta ma i clic successivi, non riesce con l'errore javascript sopra. – Paul

0

so che questo è un filo piuttosto vecchio, ma ho un altro ru soluzione per questo.

Si basa su https://stackoverflow.com/a/9648159/3183069 e https://stackoverflow.com/a/831547/3183069

.one ho aggiunto() la funzione in modo che pretende molto ciclo infinito se si annulla la stampa! Anch'io carico l'iframe una volta. Godetevi

var $body = $("body"), 
 
    $iframe, 
 
    loadiFrame = function(src) { 
 
    if ($body.children('#full-prog').length == 0) { 
 
     $body.append("<iframe id='full-prog' src='" + src + "' />"); 
 
     $iframe = $("#full-prog"); 
 
     $iframe.one('load', function() { 
 
     $iframe.get(0).contentWindow.print(); 
 
     }); 
 
    } else { 
 
     $iframe.get(0).contentWindow.print(); 
 
    } 
 
    }; 
 

 
$("#printbutton").click(function() { 
 
    loadiFrame('iframe source here'); 
 
});
#full-prog { 
 
    overflow: hidden; 
 
    position: absolute; 
 
    width: 0; 
 
    height: 0; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="button" id="printbutton" value="Load iFrame" />

Problemi correlati