2016-05-12 8 views
1

У меня проблема при печати в браузере Safari. Когда я использую window.open(url) и пытаюсь распечатать этот вновь открытый URL, он пытается распечатать пустую страницу.window.open (url) .print() не работает в Safari

Как было предложено в нескольких других местах, я попытался установить задержку в 3000 мс. Например,

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

Это попытка распечатать предыдущее окно, а не открывать новую вкладку.
Перед тем, как напечатать, я попытался использовать window.focus(). Это не помогло.

ответ

0

Во-первых, 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

+0

Уход объяснить downvote? – Kaiido

Смежные вопросы