如何在Safari/Chrome中从javascript打印IFrame

如何在Safari/Chrome中从javascript打印IFrame,javascript,iframe,webkit,printing,Javascript,Iframe,Webkit,Printing,有人能帮我在Safari/Chrome中通过javascript调用打印IFrame的内容吗 这在firefox中起作用: $('#' + id)[0].focus(); $('#' + id)[0].contentWindow.print(); 这在IE中起作用: window.frames[id].focus(); window.frames[id].print(); 但我在Safari/Chrome中找不到任何工作 谢谢 Andrew在iframe中放置一个打印函数,并从父级调用它 i

有人能帮我在Safari/Chrome中通过javascript调用打印IFrame的内容吗

这在firefox中起作用:

$('#' + id)[0].focus();
$('#' + id)[0].contentWindow.print();
这在IE中起作用:

window.frames[id].focus();
window.frames[id].print();
但我在Safari/Chrome中找不到任何工作

谢谢


Andrew

在iframe中放置一个打印函数,并从父级调用它

iframe:

function printMe() {
  window.print()
}
家长:

document.frame1.printMe()

以下是我完整的跨浏览器解决方案:

在iframe页面中:

function printPage() { print(); }
在主页上

function printIframe(id)
{
    var iframe = document.frames
        ? document.frames[id]
        : document.getElementById(id);
    var ifWin = iframe.contentWindow || iframe;

    iframe.focus();
    ifWin.printPage();
    return false;
}

更新:自从我遇到这个问题以来,在IE发布的版本中,很多人似乎都遇到了这个问题。我现在没有时间重新调查这个问题,但是,如果你被卡住了,我建议你阅读整个帖子中的所有评论

我使用了Andrew的脚本,但在调用printPage()函数之前添加了一段。iframe需要对焦,否则它仍将在IE中打印父帧

function printIframe(id)
{
    var iframe = document.frames ? document.frames[id] : document.getElementById(id);
    var ifWin = iframe.contentWindow || iframe;
    iframe.focus();
    ifWin.printPage();
    return false;
}

不过别谢我,这是安德鲁写的。我刚刚做了一个调整=P

使用firefox

window.frames
,但也添加了
name
属性,因为它在firefox中使用了iframe

即:

火狐:

window.frames[name]

<img src="print.gif"  onClick="javascript: window.frames['factura'].focus(); parent['factura'].print();">
<iframe src="factura.html" width="100%" height="400" id="factura" name="factura"></iframe>
window.frames[名称]
使用以下方法:

window.onload = setTimeout("window.print()", 1000);

需要注意的一点是,如果您使用文件:///在本地测试此功能,它将无法在chrome上工作,因为iframe中的函数将显示为未定义。但是,一旦在web服务器上,它就可以工作。

除了Andrew和Max的解决方案之外,使用iframe.focus()在IE8中打印父帧,而不是只打印子iframe。更改该行修复了它:

function printIframe(id)
{
    var iframe = document.frames ? document.frames[id] : document.getElementById(id);
    var ifWin = iframe.contentWindow || iframe;
    ifWin.focus();
    ifWin.printPage();
    return false;
}

为了在IE8中使用,我不得不做一些修改(没有使用其他IE口味进行测试)

1) frames[param]似乎接受的是数字,而不是ID

printIframe(0, 'print');

function printIframe(num, id)
{
  var iframe = document.frames ? document.frames[num] : document.getElementById(id);
  var ifWin = iframe.contentWindow || iframe;

  ifWin.focus();
  ifWin.printPage();

  return false;
}
2) 我在页面加载时显示了一个打印对话框,还有一个链接“单击此处开始打印”(如果它没有自动启动)。为了让它工作,我必须添加focus()调用


$(函数(){
printPage();
});
函数printPage()
{
焦点();
打印();
}

您可以使用

parent.frames['id'].print();
在Chrome工作

您也可以使用

top.iframeName.print();


“framePartsList.contentWindow.print();”没有在IE 11版本11.0.43中工作

所以我用了
framePartsList.contentWindow.document.execCommand('print',false,null)

您是如何使document.frame1正常工作的?我不得不改用这个:document.getElementById('frame1')。contentWindow.printMe()使用NAME属性,而不是ID。它在IE8中不起作用。它正在打印所有内容(也在iframe之外)。有什么想法吗?请检查您的打印设置。浏览器控制这一点,而不是页面。无法在ios/chrome中工作。它仍会打印父内容感谢此脚本。然而,你确实漏掉了一块,使它在IE8中工作。请看我下面的帖子,webkit,mozilla。应该在opera中工作,但让我们面对现实吧,谁在使用它?@Max我已经更新了我的答案,加入了你的编辑,这个页面一直很受欢迎,所以我认为它会有帮助:)还有安德鲁,我还有另一个想法。您不需要在子页面上定义新函数printPage,因为您只是在调用print函数。因此,倒数第二行可以是这样的:ifWin.print()@AndrewBullock对于那些即使在使用脚本时仍面临问题的人,我建议您添加一个注释来检查doctype和html标题。我的父页面和iframe页面都使用了html5样板(因此html5和顶部的一些条件),IE拒绝只打印iframe(它总是打印父页面),当我将任一页面更改为xhtml并删除条件时,iframe在没有父页面的情况下正确打印。为什么它总是只会引起头痛!!:)如果有人发现你的脚本不起作用,那么有一个指向此区域的指针可能会有所帮助。安德鲁,有一个问题……它会自动显示IE、Firefox中pdf文件的保存对话框。我怎么能做到这一点呢。我尝试使用javascript设置iframe的src,但它仍然显示save对话框。值得注意的是,如果iframe有display:none,则无法正确聚焦。您将看到与以前相同的问题--您需要使其可见,但不在屏幕上。在“ifWin.printPage()”中,printPage方法在哪里?我试着编写单独的printpage方法,但它无法访问?嘿@Pearl,看看上面的Andrews帖子。printPage函数必须是iframe中文档的一部分,并且由父文档(包含iframe的文档)上的printIframe调用。这在诸如android之类的移动设备上有效吗?谢谢。这是一个很好的问题——我自己没有测试过。这是我们在2011年开发的一个解决方案,已经6年了,所以打印机+浏览器支持已经发生了巨大的变化。这在移动设备上甚至可能没有必要,但如果您确实需要这样的东西,这个概念应该仍然有效。本质上,我们是针对DOM中的特定帧节点并调用print()方法。让我们知道会发生什么:请添加一个完整的代码,但不了解如何使用它。
parent.frames['id'].print();
top.iframeName.print();
parent.iframeName.print();