Печать содержимого iframe в Opera и Chrome
-
22-07-2019 - |
Вопрос
Я пытаюсь напечатать содержимое iframe.
contentWindow.focus();
contentWindow.print();
Этот код работает в IE, Firefox и Safari. Но не работайте в Chrome и Opera. Эти браузеры печатают всю страницу.
Я пытался использовать эту тему Как распечатать IFrame из JavaScript в Safari / Chrome . Но это не помогло мне.
Может ли кто-нибудь мне помочь?
Решение
Это известная ошибка в Opera. В дополнение к вышеупомянутым идеям для обходных путей, вы можете поиграть с чем-то вроде этого:
var clone=document.documentElement.cloneNode(true)
var win=window.open('about:blank');
win.document.replaceChild(clone, win.document.documentElement);
win.print();
Я не проверял это, но он должен создать копию страницы во всплывающем окне и распечатать ее без необходимости повторной загрузки содержимого с сервера или потери каких-либо модификаций DOM, которые вы, возможно, захотите распечатать.
Другие советы
Как я понимаю, внедрение 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>
Я не могу воспроизвести вашу проблему с 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();
}
Надеюсь, это поможет.
Я пробовал приведенный выше код, и после внесения изменений в вышеприведенный код я получил окончательный код, как указано ниже
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()}
попробуйте это