Jquery 从父窗口打印动态创建的iframe的内容

Jquery 从父窗口打印动态创建的iframe的内容,jquery,iframe,printing,Jquery,Iframe,Printing,我有一个带有链接列表的页面和一个div,它作为链接指向的页面的占位符。用户每次单击链接时,都会在div中创建一个iframe,其src属性会获得link href属性的值-简单明了,类似于外部网页库。 我的问题是打印iframe的内容。为此,我使用以下代码: function PrintIframe() { frames["name"].focus(); frames["name"].print(); } 函数PrintIframe() { 帧[“名称”]。焦点(); 框架[

我有一个带有链接列表的页面和一个div,它作为链接指向的页面的占位符。用户每次单击链接时,都会在div中创建一个iframe,其src属性会获得link href属性的值-简单明了,类似于外部网页库。 我的问题是打印iframe的内容。为此,我使用以下代码:

function PrintIframe() { frames["name"].focus(); frames["name"].print(); } 函数PrintIframe() { 帧[“名称”]。焦点(); 框架[“名称”]。打印(); }
问题似乎在于iframe是由JQuery动态创建的——当我将iframe直接插入html代码时,浏览器会正确打印外部页面。但是对于JavaScript注入的相同代码,什么也没有发生。我尝试在“打印”链接上使用JQ1.3“实时”事件,但没有成功。有办法克服这个问题吗?

嗯,我做对了吗?您只需要更改IFrame指向的源

$("#iframe").attr("src", "http://www.example.com");

可能是相同的域限制阻止了JavaScript的执行。如果A和B来自同一个域,则相同的域限制允许框架A(或主窗口)中的JavaScript与框架B交互(例如.print())。检查JavaScript错误控制台。如果出现类似安全异常/权限错误的情况,则很可能是由于相同的域限制。

我尝试了此方法,并能够复制此问题。我注意到当调用print函数时,iframe没有完成加载。我通过调用PrintIFrame()时检查innerHTML的值来测试这一点。要克服此问题,您可以在x毫秒后使用setTimeOut再次调用该函数:

function PrintIframe() { 

        if (window.frames['myname'].innerHTML != "") {
            window.frames['myname'].focus();
            window.frames['myname'].print();
        } else {
            setTimeout(PrintIframe,1000);
        }    
    }
这对我有用

编辑 奇怪的是,我的测试代码中有一个警报,这似乎使它正常工作。当我把它拿出来时,它不起作用。对不起:(

无论如何,这应该使用jQuery将加载事件处理程序附加到iframe来完成。我已经在IE8上进行了测试,它可以工作:

<html>
<head>
    <script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
    function loadiFrame(src)
    {
        $("#iframeplaceholder").html("<iframe id='myiframe' name='myname' src='" + src + "' />");
    }

    $(function()
    {
        $("#printbutton").bind("click", 
            function() { 
                loadiFrame('test.aspx'); 
                $("#myiframe").load( 
                    function() {
                        window.frames['myname'].focus();
                        window.frames['myname'].print();
                    }
                 );
            }
        );
    });
    </script>    
</head>
<body>
    <input type="button" id="printbutton" value="Load iFrame" />
    <div id="iframeplaceholder"></div>
</body>
</html>

函数loadiFrame(src)
{
$(“#iframepholder”).html(“”);
}
$(函数()
{
$(“#打印按钮”).bind(“单击”,
函数(){
loadiFrame('test.aspx');
$(“#myiframe”).load(
函数(){
frames['myname'].focus();
frames['myname'].print();
}
);
}
);
});

假设您的iframe是这样的:

<iframe id='print-iframe' name='print-frame-name'></iframe>
下面是使用本机JavaScript的方法:

document.getElementById("print-iframe").contentWindow.print();

我在网上搜索时发现了这个

$('#preview-iframe').contents().find('html').html(data); 
改成

$('#preview-iframe').contents().find('html').html(data).after(function() {
    document.getElementById("preview-iframe").contentWindow.print();
});

我在打印iframe的内容时遇到问题。要实现这一点,请使用以下代码:

例如,您有iframe:

<iframe id='print-iframe' name='print-iframe'></iframe>
函数的代码:

function printIframe(iFrameId) {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf ("MSIE ");
    var iframe = document.getElementById(printFrameId);

    if (msie !== 0) {
        iframe.contentWindow.document.execCommand('print', false, null);
    } else {
        iframe.contentWindow.print();
    }
}

我知道这是一个相当老的线程,但我有一个更鲁布的解决方案

这是基于 及

我添加了.one()函数,因此如果取消打印,它不会无限循环! 我还加载了一次iframe。请欣赏

var$body=$(“body”),
$iframe,
loadiFrame=函数(src){
if($body.children('#full prog')。长度==0){
$body。追加(“”);
$iframe=$(“#完整程序”);
$iframe.one('load',function(){
$iframe.get(0.contentWindow.print();
});
}否则{
$iframe.get(0.contentWindow.print();
}
};
$(“#打印按钮”)。单击(函数(){
loadiFrame(“此处为iframe源”);
});
#完整程序{
溢出:隐藏;
位置:绝对位置;
宽度:0;
身高:0;
}

这是一个非常古老的线程,但我找到了一个解决方案

我在jquery中添加了sleep,这样它就不会打印空窗口,重新加载新替换的内容只需要几秒钟

$('#printiframe').attr('src', pdf_file_path);
setTimeout(function () {
     $("#printiframe").get(0).contentWindow.print();
}, 500);

不,问题是我无法在iframe中打印页面-有2个选项:1)可以像打印页面的一部分一样打印(使用PrintArea插件)-但是它只打印一个页面,iframe页面的内容在纸张上的格式不符合要求。2) 可以将其作为普通页面打印,但前提是iframe标记不是通过JS动态插入的,而是以HTML静态显示的。不,我在Firebug中没有此类错误。。。是的,这些页面都来自同一个域。对我来说不是。(同样,html也可以,但如果它是由JQ自己创建的,它不会打印iframe。您上一次的详细阐述在测试页面上对我来说是可行的,应该进一步研究……这似乎很好。但是,我认为最好检查(msie>-1)。这只是简单的检查:)来源是:它只能工作一次。如果我再次单击该按钮,就会出现“JavaScript运行时错误:访问被拒绝”。我正在尝试以静默方式打印pdf文档。我有一个有多个条目的表格,每个条目都可以“打印”。单击条目的“打印”按钮时,iframe的src将更新为新的url,并执行上述代码以静默方式打印它。正如我所说,它只工作一次,但在随后的点击中,它失败了,出现了上面的javascript错误。
printIframe('print-iframe');
function printIframe(iFrameId) {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf ("MSIE ");
    var iframe = document.getElementById(printFrameId);

    if (msie !== 0) {
        iframe.contentWindow.document.execCommand('print', false, null);
    } else {
        iframe.contentWindow.print();
    }
}
$('#printiframe').attr('src', pdf_file_path);
setTimeout(function () {
     $("#printiframe").get(0).contentWindow.print();
}, 500);