Печать содержимого iframe в Opera и Chrome - PullRequest
6 голосов
/ 30 октября 2009

Я пытаюсь напечатать содержимое iframe.

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

Этот код работает в IE, Firefox и Safari. Но не работайте в Chrome и Opera. Эти браузеры печатают всю страницу.

Я пытался использовать эту тему Как распечатать IFrame из JavaScript в Safari / Chrome . Но это не помогло мне.

Может ли кто-нибудь мне помочь?

Ответы [ 4 ]

4 голосов
/ 03 декабря 2009

Это известная ошибка в Opera. В дополнение к вышеупомянутым идеям для обходных путей, вы можете поиграть с чем-то вроде этого:

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

Я не проверял это, но он должен создать копию страницы во всплывающем окне и распечатать ее без необходимости повторной загрузки контента с сервера или потери каких-либо модификаций DOM, которые вы можете распечатать.

2 голосов
/ 02 ноября 2009

Как я понимаю, внедрение 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 голос
/ 02 ноября 2009

Я не могу воспроизвести вашу проблему с Chrome. Однако Opera действительно печатает всю внешнюю страницу, пытаясь распечатать только iframe.

Я разработал обходной путь, и хотя он работает в основном, он не на 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();
}

Надеюсь, это поможет.

0 голосов
/ 19 апреля 2012

Я попробовал вышеуказанный код, и после внесения изменений в вышеуказанные коды, я получил окончательный код следующим образом

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

попробуйте это

...