使用Javascript打印(部分)网页

使用Javascript打印(部分)网页,javascript,html,web,printing,Javascript,Html,Web,Printing,我知道有两种方法可以调用浏览器的“打印”对话框(当然,我使用了搜索): 文件.打印() document.execCommand('print',false,null) 他们之间有什么区别?支持跨浏览器?论文、文件还是标准?使用哪一个更正确 另一个问题:打印网页给定部分最直接的方法是什么?我知道我们可以创建新窗口或iframe来调用上面两种打印方法中的任何一种。哪一个陷阱较少?我已经测试了跨浏览器打印部分网页的不同方法: Chrome、Firefox、Opera(12和新)、IE11、10、

我知道有两种方法可以调用浏览器的“打印”对话框(当然,我使用了搜索):

  • 文件.打印()
  • document.execCommand('print',false,null)
他们之间有什么区别?支持跨浏览器?论文、文件还是标准?使用哪一个更正确


另一个问题:打印网页给定部分最直接的方法是什么?我知道我们可以创建新窗口或iframe来调用上面两种打印方法中的任何一种。哪一个陷阱较少?

我已经测试了跨浏览器打印部分网页的不同方法: Chrome、Firefox、Opera(12和新)、IE11、10、9和8。我已尝试创建新的
窗口
、新的
iframe
,或在页面上使用现有的
iframe
。然后尝试了
.print()
.execCommand('print')

注意:请记住,.print()是在窗口中调用的,而.execCommand()是在文档中调用的

可以找到用于测试的代码

如果我的测试代码是错误的,请纠正我,我只是想找到最清晰的方法来完成这项工作。我的结论:

  • Opera 12无法打印网页的一部分(?)
  • IEs不
    print()
    iFrame和窗口,当前窗口除外
  • 在iFrame内部或IEs中创建的窗口中调用
    documents上的
    print()
    ,会中断当前
    文档上的
    print()
    。小心
  • jQuery插件使用IE的技巧来完成这项工作,而且它很有效。唯一的例外是歌剧12。顺便说一下,这个插件使用
    print()
  • execCommand('print')
    几乎在任何地方都可以使用任何方法(iFrame、window)。但是Firefox不支持它
  • execCommand()
    如果调用不成功,则返回
    false
    ,因此如果不想使用插件和魔术,请创建窗口或iframe,调用
    execCommand('print')
    ,如果返回
    false
    ,则调用
    print()
还有一件事:


创建
iframe
很棘手:您不能直接访问其窗口或文档(是的,您有ContentDocument属性,它在不同浏览器中的行为不同)。您应该命名它,然后调用
window.frames[name]
从该iframe获取window对象。不要尝试调用
window.frames(id)
-它将返回iframe

接受答案中提到的最后一个方法,然后,结果如下所示:

iframe = document.getElementById('iframe-id');
var printed = iframe.contentWindow.document.execCommand('print', false, null);

if (!printed) window.print();
备选方案:

try {
    iframe = document.getElementById('iframe-id');
    iframe.contentWindow.document.execCommand('print', false, null);
}
catch(e) {
    window.print();
}
printThis使用的类似方法

if (document.queryCommandSupported("print")) {
    $iframe[0].contentWindow.print();
    $iframe[0].contentWindow.document.execCommand("print", false, null);
} else {
    $iframe[0].contentWindow.focus();
    $iframe[0].contentWindow.print();
}

您可以使用window.open和execomand(saveas)的组合 例如:


函数saveas(){
var oPrntWin=window.open(“,”_blank“,”宽度=1,高度=1,左侧=1,顶部=1,菜单栏=yes,工具栏=yes,可调整大小=yes,位置=no,滚动条=yes”);
oPrntWin.document.open();
oPrntWin.document.write(editeur.innerHTML);
oPrntWin.document.execCommand(“SaveAs”,true,“C:\\My Documents\\Saved Content.html”);
oPrntWin.document.close();
}
editeur.html是我的文档的一部分 你可以为你的框架做同样的事情
将新窗口中的写入替换为正文的属性“src”

在大多数情况下,您将使用document.print()。请查看document.execCommand的文档:@HarveyA.Ramer该链接没有记录任何
print
命令。@torazaburo这里是GitHub的一个关于打印可能性的大总结,其中包括execCommand('print')示例:它似乎使用了这个jQuery插件:在Android浏览器上,
窗口[iframeName].document.execCommand('print')
似乎可以打印整个页面。您看到了吗?请注意,根据,Android 5-6(棒棒糖棉花糖)不支持此功能.@torazaburo不,我只对桌面浏览器感兴趣。@torazaburo我也遇到了同样的问题。Android chrome打印整个页面,而不仅仅是iframe。你有什么解决办法吗?如果有人能帮忙,谢谢你。@Rajkishore这是一个已知的漏洞,仍然很突出,不幸的是,我现在懒得追踪链接。这个问题是关于将页面发送到打印机,而不是关于将其保存为文件
<script  type= "text/javascript">
 function saveas() {
  var oPrntWin = window.open("","_blank","width=1,height=1,left=1,top=1,menubar=yes,toolbar=yes,resizable=yes,location=no,scrollbars=yes");
  oPrntWin.document.open();
  oPrntWin.document.write(editeur.innerHTML);
  oPrntWin .document.execCommand("SaveAs",true,"C:\\My Documents\\Saved Content.html");
 oPrntWin.document.close();
 }
 </script>