2010-07-15 82 views
8

我的网站有一个“打印此页”按钮。Safari:在打印Iframe时阻止两个打印对话框

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

我已经尝试从iframe中调用window.print,并从父对象调用iframe(document.printFrame.window.print()),但我无论如何都得到两个对话框。

有没有人知道解决这个问题的方法?我只想打印Iframe,而不是父级。

回答

1

我无法重现该错误;它适用于我(即:我只有一个打印对话框),无论我是否从iframe或父框架调用它。也许你在某处调用window.print()两次?

我在Mac OS X上运行的Safari 4.0.3 10.6

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

编辑2:我只是测试这在Safari 5.0/Windows 7和它工作正常。你确定它不是你的代码中的其他东西吗?

编辑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 
+0

如果我调用它两次,我希望在其他浏览器上有相同的行为。嗯... – 2010-07-19 13:18:15

+0

@Diodeus你得到2打印对话框与我的[小提琴](http://jsfiddle.net/Kq9dc/)? – quantumSoup 2010-07-19 15:02:47

+0

@Diodeus更多测试,他们似乎工作正常 – quantumSoup 2010-07-19 17:34:43

0

试试这个。把这个说的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后执行()已完成,否则Firefox用户可能会在打印对话框下看到一个空白页面