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

我有一个页面,其中包含一个链接列表和一个div,它用作链接所引导页面的占位符。 每次用户点击链接时,都会在div中创建iframe,并且其src属性会获取链接href属性的值 – 简单明了,类似于外部网页库。 我有什么问题是打印iframe的内容。 为此,我使用此代码:

函数PrintIframe()  
 {  
 。帧[ “名称”]聚焦();  
帧[ “名称”]打印();  
 }

问题似乎是iframe是由JQuery动态创建的 – 当我将iframe插入到html代码中时,浏览器会打印外部页面。 但是使用JavaScript注入相同的代码没有任何反应。 我试图在“打印”链接上使用JQ 1.3“live”事件,但没有成功。 有办法克服这个问题吗?

假设这是你的iframe看起来像:

 

这是你使用jQuery的方法:

 $("#print-iframe").get(0).contentWindow.print(); 

这就是你使用原生JavaScript的方式:

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

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

例如,你有iframe:

  

然后js打印iframe的内容调用此函数(在ie和其他浏览器中都有效):

 printIframe('print-iframe'); 

function代码:

 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(); } } 

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

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

这对我有用

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

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

        

嗯我能说得对吗? 您只需要更改IFrame导致的来源?

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

也许相同的域限制会阻止您的JavaScript执行。 如果A和B来自同一域,则相同域限制允许帧A(或主窗口)中的JavaScript与帧B交互(例如.print())。 检查您的JavaScript错误控制台。 如果你得到类似安全exception/权限错误的东西,那么很可能是因为相同的域限制。

 var ifrm = document.createElement("iframe"); // ifrm.style.display = "none"; document.body.appendChild(ifrm); setTimeout(function() { $(ifrm).contents().find("body").html("my html content"); }, 1); ifrm.onload = function() { ifrm.contentWindow.print(); } 

我发现这在网上搜索

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

并改为

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

twigstechtips

我知道这是一个非常古老的线程,但我有一个更好的解决方案。

它基于https://stackoverflow.com/a/9648159/3183069和https://stackoverflow.com/a/831547/3183069

我添加了.one()函数,所以如果你取消打印它就不会无限循环! 我也加载了一次iframe。 请享用

 var $body = $("body"), $iframe, loadiFrame = function(src) { if ($body.children('#full-prog').length == 0) { $body.append(""); $iframe = $("#full-prog"); $iframe.one('load', function() { $iframe.get(0).contentWindow.print(); }); } else { $iframe.get(0).contentWindow.print(); } }; $("#printbutton").click(function() { loadiFrame('iframe source here'); }); 
 #full-prog { overflow: hidden; position: absolute; width: 0; height: 0; } 
   

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

我在jquery中添加了sleep,因此它不会打印空窗口,它需要几秒钟来重新加载新替换的内容。

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