Во-первых, Window
объект, переданный в SetTimeout является один из оригинальной страницы, так что вы должны сделать что-то вроде
var popup = window.open(url);
popup.onload= function(){
// this now refers to `popup`
this.print()
}
Но так как вы упомянули вопрос Safari, отмечу, что это, кажется, работают только для обычной страницы документа (по крайней мере для файлов HTML) в этом браузере.
Для документов, таких как data:image/...
объект Window возвращаемый window.open()
не имеет какого-либо имущества (по крайней мере в прослушивается Safari 9.1 на 10.9, не пробовал в других версиях), поэтому вы не можете вызвать метод popup.print()
.
Один из способов для этого - создать себе страницу и, например, изображение, добавить тег <img>
с нужным URL-адресом, как 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
Уход объяснить downvote? – Kaiido