window.open(url).print()在Safari中不起作用

时间:2016-05-12 01:10:02

标签: javascript printing safari

我在Safari浏览器中打印时遇到问题。当我使用window.open(url)并尝试打印这个新打开的URL时,它会尝试打印一个空白页面。

正如其他几个网站所建议的那样,我试图将延迟设置为3000毫秒。像,

window.open(url)
setTimeout(print, 3000);

这会尝试打印上一个窗口,而不是打开新选项卡 我在打印前尝试使用window.focus()。它没有帮助。

1 个答案:

答案 0 :(得分:0)

首先,setTimeout中传递的Window对象是原始页面中的对象,因此您应该执行类似

的操作
var popup = window.open(url);
popup.onload= function(){
    // this now refers to `popup`
    this.print()
} 

但是既然你提到了Safari问题,我会注意到这似乎只适用于这个浏览器中的普通文档页面(至少对于HTML文件)。

对于像data:image/...这样的文档,window.open()返回的Window对象没有任何属性(至少在10.9版本的Safari 9.1中,在其他版本中未尝试过),因此你可以不要调用popup.print()方法。

一种方法是为自己创建页面,例如为图片添加<img>标记,并将所需的网址添加为src。 这取决于你打算打印的内容。

var url = 'data:image/png;base64,...';

// you have to keep a reference of the new Window
var popup = window.open(url);

var tryToPrint = function() {
  // we have access to the window methods
  if (popup.print) {
    // call directly its print method
    popup.print()
  } else {
    // close this one
    popup.close();
    // open a new blank one
    popup = window.open('');
    // create an image
    var img = popup.document.createElement('img');
    // reproduce default Safari's styles
    img.setAttribute('style', '-webkit-user-select:none; display:block; margin:auto;');
    // once the image has loaded, we can print the page
    img.onload = function() {
      popup.print()
    };
    popup.document.body.appendChild(img);
    img.src = url;

  }
};
// unfortunately, we can't even listen to the load event of the bugged popup
// so come back to an ugly timeout...
setTimeout(tryToPrint, 200);

Live Demo