У меня были проблемы со всеми вышеуказанными решениями в IE8, я нашел достойный обходной путь, который тестируется в IE 8 + 9, Chrome, Safari и Firefox. Для моей ситуации мне нужно было распечатать отчет, который был сгенерирован динамически:
// create content of iframe
var content = '<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">'+
'<head><link href="/css/print.css" media="all" rel="stylesheet" type="text/css"></head>'+
'<body>(rest of body content)'+
'<script type="text/javascript">function printPage() { window.focus(); window.print();return; }</script>'+
'</body></html>';
Обратите внимание на метод javascript printPage () перед тегом закрытия тела.
Затем создайте iframe и добавьте его в родительское тело, чтобы его contentWindow было доступно:
var newIframe = document.createElement('iframe');
newIframe.width = '0';
newIframe.height = '0';
newIframe.src = 'about:blank';
document.body.appendChild(newIframe);
Далее установите содержимое:
newIframe.contentWindow.contents = content;
newIframe.src = 'javascript:window["contents"]';
Здесь мы устанавливаем переменную динамического содержимого для объекта окна iframe, затем вызываем его по схеме javascript:
Наконец-то распечатать; сфокусировать iframe и вызвать функцию javascript printPage () внутри содержимого iframe:
newIframe.focus();
setTimeout(function() {
newIframe.contentWindow.printPage();
}, 200);
return;
setTimeout необязательно необходим, однако, если вы загружаете большое количество контента, я обнаружил, что Chrome иногда не может печатать без него, поэтому рекомендуется этот шаг. Альтернативой является завершение 'newIframe.contentWindow.printPage ();' при попытке поймать и поместить упакованную версию setTimeout в блок catch.
Надеюсь, это кому-нибудь поможет, так как я потратил много времени на поиск решения, которое хорошо работало в нескольких браузерах Благодаря SpareCycles .
EDIT:
Вместо использования setTimeout для вызова функции printPage используйте следующее:
newIframe.onload = function() {
newIframe.contentWindow.printPage();
}