繁体   English   中英

在IE中打印iframe

[英]Print iframe in IE

我有一个按钮,可以将报表加载到div中的“隐形”iframe中并打印出iframe; 用户按下按钮以打印报告(包含在不同的页面上)而不更改页面或除打印对话框之外的任何视觉中断。 它适用于Chrome和Firefox,但不适用于IE。 在IE中,父页面被完整打印,并且在页面底部插入了一个微小的混乱iframe(我正在加载iframe)。

这是没有内容的空div,它就在那里我有一个ID标记的地方风格和坚持Javascript的内容:

<div id="printerDiv"></div>

这是javascript函数,onClick我的按钮这个函数触发并将我的打印页面插入到printerDiv内的iframe中,加载此页面后它会打印:

function printPage(url) {
    var div = document.getElementById("printerDiv");
    div.innerHTML = '<iframe src="'+url+'" onload=this.contentWindow.print();>
        </iframe>';
 }

这是隐藏div的CSS。 我正在使用绝对定位将其从可见屏幕区域移开。 我曾经使用display:none,但是Firefox无法打印iframe样式:

#printerDiv{
    position:absolute;
    left:-9999px;
}

当我在IE中打印它打印整页,然后在#printerDiv的底部,我得到这个小iframe: 在此输入图像描述

所以正在加载内容,但它不是只打印iframe,而且它也没有正确隐藏iframe。 我插入到#printerDiv任何其他内容都被正确隐藏,只有iframe显示如此。

我已经在我的Javascript函数中尝试了这个问题的所有解决方案:使用self.prin t,使用document.parentWindow.print ,将printerDiv上的样式更改为0px高度/宽度也不起作用。

我很欢迎不使用iframe的解决方案(IE似乎有很多问题)但我需要这种能力来加载屏幕上看不到的内容并通过按钮直接打印。

在我的情况下,解决方案是隐藏我想要打印的iframe。 如果我隐藏它(使用display:none; visibility:hidden等),父页面将始终打印。

而不是实际隐藏框架,我只是10x10和无边框。 现在这个工作(延迟技巧)。

示例代码:

    <script type="text/javascript">
    function printFrame(frameId, targetContent)
    {
        var doc = $('#'+frameId).get(0).contentWindow.document;
        var $body = $('body',doc);

        $body.html($('#'+targetContent).html());

        setTimeout(function(){
            $('#'+frameId).get(0).contentWindow.focus();
            $('#'+frameId).get(0).contentWindow.print();            
        }, 1000);        
    }
</script>

HTML:

<div id="contentToPrint">
I just want to print this stuff
</div>
<iframe src="about:blank" id="printframe" style="border:0" width="10" height="10"></iframe>

按钮打印:

<a href="javascript:printFrame('printframe','contentToPrint')">Print frame</a>

我最近和IE10有同样的问题,添加了一个超时并得到了我想要的结果,iFrame打印出而不是父页面:

<script type="text/javascript">
function selfPrint(){
    self.focus();
    self.print();
}
setTimeout('selfPrint()',2000);
</script>

我和IE11有同样的问题。 似乎IE忽略了.focus()调用,而是打印父页面和iframe。 我的解决方案是注入一个样式标签,在打印之前隐藏除iframe之外的所有内容,然后在调用print之后删除样式。 我的代码在这里http://ironlasso.com/print-only-lightbox-or-modal-window-content/

`<script>

function framePrint(whichFrame) {

parent[whichFrame].focus();

parent[whichFrame].print();

}

</script>`

<a href="javascript:framePrint('FRAMENAME');">Print</a>

将FRAMENAME更改为您要打印的帧的名称。

你可以尝试这样的事情:

使用类似jQuery的.load()来将报告放在#printerDiv并将其与CSS区分开来

在你的CSS上

#printerDiv{display:none;}
@media print{
    body *{display:none;}
    #printerDiv{display:block;height:100%;width:100%}
}

和打印按钮javascript

$('#printerDiv').empty().load(url, function(){
        window.print();
    }); //or whatever library/pure js you like

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM