6

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

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

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

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

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

4

4 に答える 4

5

これは Opera の既知のバグです。上記の回避策のアイデアに加えて、次のようなものを試すことができます。

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

私はこれをテストしていませんが、ポップアップ ウィンドウにページのコピーを作成して印刷する必要があります。サーバーからコンテンツを 2 回読み込んだり、印刷したい DOM の変更を失ったりする必要はありません。

于 2009-12-03T13:08:06.000 に答える
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();
}

また、本文の最後に次のコードを追加しました (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>
于 2009-11-02T05:22:17.660 に答える
1

Chrome で問題を再現できません。ただし、iframe のみを印刷しようとすると、Opera は実際に外側のページ全体を印刷します。

私は回避策を考案しましたが、ほとんどは機能しますが、100% フェイルセーフではありません (とりわけ、Opera は印刷のために行を折り返すため、そのような場合に正しい高さを計算する方法がわかりません)。とはいえ、次のコードは少なくとも合理的に機能します (便宜上 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();
}

お役に立てれば。

于 2009-11-02T18:12:58.180 に答える
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()}

これを試してください

于 2012-04-19T10:46:31.797 に答える