代码之家  ›  专栏  ›  技术社区  ›  Diodeus - James MacFarlane

Safari:打印iframe时阻止两个打印对话框

  •  8
  • Diodeus - James MacFarlane  · 技术社区  · 14 年前

    我的网站有一个“打印此页面”按钮。

    我将静态打印模板html文件加载到隐藏的iframe中,使用jquery将html复制到该页,然后调用 window.print() 从iframe页面。一切都很好,除了Safari,它也要打印父框架,所以我打开了两个打印对话框。

    我尝试从iframe中调用window.print,并从父级调用它,以iframe为目标( document.printFrame.window.print() )但不管怎样,我有两个对话。

    有人知道怎么解决这个问题吗?我只想打印iframe,不想打印家长。

    2 回复  |  直到 14 年前
        1
  •  1
  •   quantumSoup    14 年前

    我不能复制这个bug;它对我来说很好(即:我只有一个打印对话框),不管是从i frame还是父框架调用它。也许你在某处两次调用window.print()?

    我在Mac OS X 10.6上运行Safari 4.0.3

    编辑: 这里是: http://jsfiddle.net/Kq9dc/

    编辑2: 我刚在Safari 5.0/Windows7上测试过,它工作正常。您确定代码中没有其他内容吗?

    编辑3 :刚刚在WinXP上的几个版本的Safari上测试过:

    Safari 3.0 (first beta): Not working (no print dialog)
    Safari 3.1 (first non-beta): Works fine
    Safari 4.0: Works fine
    Safari 5.0: Works fine
    
        2
  •  0
  •   Michael F    14 年前

    试试这个。把这个放在所说的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;
    }
    

    如果这也不起作用,我会尝试打开一个新的窗口/选项卡,并用可打印的HTML填充它。

    var printwin = window.open("about:blank", "_new");
    printwin.document.open();
    printwin.document.write("HTML goes here..javascript which is going to print is in there too..");
    printwin.document.close();
    

    要注意的两个小问题是

    • 分裂 </script> 在新窗口中,这样就不会过早终止
    • 使用setTimeout()在onload()完成后执行,否则火狐用户可能会在打印对话框下面看到一个空白页。