2009-10-30 5 views
6

iframeコンテンツを印刷しようとしています。OperaとChromeのiframeコンテンツを印刷

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

このコードは、IE、Firefox、Safariで動作します。しかし、ChromeとOperaでは動作しません。これらのブラウザはページ全体を印刷します。

私はこのトピックを使用しようとしましたHow do I print an IFrame from javascript in Safari/Chrome。しかしそれは私を助けませんでした。

誰かが私を助けることができますか?

+0

を試してみてください、次のように私は決定的なコードに付属のコード上および上記のコードに変更を加えた後、試してみました成功。 iframeは別のドメインにありますか? – Paul

+0

いいえ同じドメインのものです。 –

答えて

4

これはOperaの既知のバグです。私はこれをテストしていませんが、それはポップアップウィンドウ内のページのコピーを作成しなくても、それを印刷する必要があり

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

:回避策については上記の考え方に加えて、あなたはこのような何かをプレイしたい場合があります2回目にサーバーからコンテンツをロードしたり、印刷したいDOMの変更を失ったりすることができます。

2

私が理解しているように、新しいウィンドウを開くことなくiframeの印刷を実装することは不可能です。

マイプリント機能:

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

はまた、私は体(印刷== 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

私はクロームを使用して問題を再現することはできません。 Operaは、iframeだけを印刷しようとしても、実際には外部ページ全体を印刷しています。

私は回避策を考案しましたが、大部分は動作しますが、フェールセーフではありません(オペラは印刷行を折り返すため、正しい場合は正しい高さを計算する方法がわかりません)。つまり、次のコードは少なくとも(jQueryを使用して)便宜的に動作します。

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

希望します。

0

は私が

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

は少なくともChromeのあなたが持っている必要があり、それはのように思えるリンク先の記事から、この1