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