Как распечатать IFrame из JavaScript в Safari / Chrome - PullRequest
50 голосов
/ 23 января 2009

Может кто-нибудь помочь мне с печатью содержимого IFrame с помощью вызова JavaScript в Safari / Chrome.

Это работает в Firefox:

$('#' + id)[0].focus();
$('#' + id)[0].contentWindow.print();

это работает в IE:

window.frames[id].focus();
window.frames[id].print();

Но я не могу заставить что-либо работать в Safari / Chrome.

Спасибо

Andrew

Ответы [ 11 ]

48 голосов
/ 23 января 2009

Вот мое полное кросс-браузерное решение:

на странице iframe:

function printPage() { print(); }

на главной странице

function printIframe(id)
{
    var iframe = document.frames ? document.frames[id] : document.getElementById(id);
    var ifWin = iframe.contentWindow || iframe;
    iframe.focus();
    ifWin.printPage();
    return false;
}

Обновление : у многих людей возникают проблемы с этим в версиях IE, выпущенных, так как у меня была эта проблема. У меня нет времени для повторного расследования прямо сейчас, если вы застряли, я предлагаю вам прочитать все комментарии во всей этой цепочке!

42 голосов
/ 23 января 2009

Поместите функцию печати в iframe и вызовите ее у родителя.

IFrame:

function printMe() {
  window.print()
}

Родитель:

document.frame1.printMe()
32 голосов
/ 26 мая 2010

Я использовал скрипт Эндрю, но добавил кусок перед вызовом функции printPage (). Iframe нуждается в фокусировке, иначе он все равно будет печатать родительский фрейм в IE.

function printIframe(id)
{
    var iframe = document.frames ? document.frames[id] : document.getElementById(id);
    var ifWin = iframe.contentWindow || iframe;
    iframe.focus();
    ifWin.printPage();
    return false;
}

Не благодари меня, хотя Эндрю написал это. Я только что сделал твик = P

8 голосов
/ 20 апреля 2011

В дополнение к решениям Эндрю и Макса использование iframe.focus () привело к печати родительского кадра вместо печати только дочернего iframe в IE8. Изменение этой строки исправило это:

function printIframe(id)
{
    var iframe = document.frames ? document.frames[id] : document.getElementById(id);
    var ifWin = iframe.contentWindow || iframe;
    ifWin.focus();
    ifWin.printPage();
    return false;
}
4 голосов
/ 28 октября 2010

Используйте firefox window.frames, но также добавьте свойство name, поскольку при этом используется iframe в firefox

IE:

window.frames[id]

Firefox:

window.frames[name]

<img src="print.gif"  onClick="javascript: window.frames['factura'].focus(); parent['factura'].print();">
<iframe src="factura.html" width="100%" height="400" id="factura" name="factura"></iframe>
3 голосов
/ 08 декабря 2011

Мне пришлось сделать несколько модификаций, чтобы сделать это в IE8 (не тестировал с другими версиями IE)

1) document.frames [param], кажется, принимает число, а не ID

printIframe(0, 'print');

function printIframe(num, id)
{
  var iframe = document.frames ? document.frames[num] : document.getElementById(id);
  var ifWin = iframe.contentWindow || iframe;

  ifWin.focus();
  ifWin.printPage();

  return false;
}

2) У меня было диалоговое окно печати, отображаемое при загрузке страницы, а также была ссылка «Нажмите здесь, чтобы начать печать» (если она не запускалась автоматически). Чтобы это работало, мне пришлось добавить вызов focus ()

<script type="text/javascript">
  $(function(){
    printPage();
  });

  function printPage()
  {
    focus();
    print();
  }
</script>
3 голосов
/ 07 декабря 2010

Стоит отметить, что если вы тестируете это локально, используя file: ///, он не будет работать на chrome, так как функция в iframe будет выглядеть как неопределенная. Однако однажды на веб-сервере это будет работать.

0 голосов
/ 22 июня 2017

'framePartsList.contentWindow.print ();' не работал в IE 11 ver11.0.43

Поэтому я использовал framePartsList.contentWindow.document.execCommand ('print', false, null);

0 голосов
/ 12 февраля 2016

Вы также можете использовать

top.iframeName.print();

или

parent.iframeName.print();
0 голосов
/ 21 января 2015

Вы можете использовать

parent.frames['id'].print();

Работа в Chrome!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...