Приведенный выше ответ (с использованием события onload) является верным, однако в некоторых случаях это, похоже, ведет себя неправильно. Особенно при динамическом создании шаблона печати для веб-контента.
Я пытаюсь распечатать определенное содержимое страницы, создав динамический фрейм и распечатав его. Если он содержит изображения, я не могу заставить его срабатывать при загрузке изображений. Он всегда срабатывает слишком рано, когда изображения все еще загружаются, что приводит к неполной печати:
function printElement(jqElement){
if (!$("#printframe").length){
$("body").append('<iframe id="printframe" name="printframe" style="height: 0px; width: 0px; position: absolute" />');
}
var printframe = $("#printframe")[0].contentWindow;
printframe.document.open();
printframe.document.write('<html><head></head><body onload="window.focus(); window.print()">');
printframe.document.write(jqElement[0].innerHTML);
printframe.document.write('</body></html>');
// printframe.document.body.onload = function(){
// printframe.focus();
// printframe.print();
// };
printframe.document.close();
// printframe.focus();
// printframe.print();
// printframe.document.body.onload = function()...
}
как вы можете видеть, я попробовал несколько методов для привязки обработчика загрузки ... в любом случае он сработает слишком рано. Я знаю это, потому что предварительный просмотр в браузере (Google Chrome) содержит поврежденные изображения. Когда я отменяю печать и снова вызываю эту функцию (изображения теперь кэшируются), предварительный просмотр печати в порядке.
... к счастью, я нашел решение. не красиво, но подходит. Что он делает, что сканирует поддерево для тегов 'img' и проверяет их 'полное' состояние. если он не завершен, он задерживает повторную проверку через 250 мс.
function delayUntilImgComplete(element, func){
var images = element.find('img');
var complete = true;
$.each(images, function(index, image){
if (!image.complete) complete = false;
});
if (complete) func();
else setTimeout(function(){
delayUntilImgComplete(element, func);}
, 250);
}
function printElement(jqElement){
delayUntilImgComplete(jqElement, function(){
if (!$("#printframe").length){
$("body").append('<iframe id="printframe" name="printframe" style="height: 0px; width: 0px; position: absolute" />');
}
var printframe = $("#printframe")[0].contentWindow;
printframe.document.open();
printframe.document.write(jqElement[0].innerHTML);
printframe.document.close();
printframe.focus();
printframe.print();
});
}