Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Вывод на печать. Javascript


Автор: ksnk 3.4.2013, 13:49
Требуется со страницы вывести на печать некую информацию. На странице выводится много картинок, на печать нужно вывести только одну с сопроводительным текстом, при нажатии на кнопку возле ее. В идеале, хочется получить минимум пользовательских телодвижений - нажал на кнопку печать, подтвердил желание в окне принтера и все.

Стандарное решение - печать идет функцией window.print() и все ненужное со страницы убирается стилями с @media print

К сожалению, воспользоваться этим способом  не представляется возможным (во всяком случае, на первый взгляд). 

Сами кнопки формируется таким образом. В цикле перебираются имена банеров...

Код

<a href="javascript:print_koupon('<?=$x?>')"><img src="/images/print.jpg"/>
                Напечатать</a>


функция печати выглядит так
Код

function print_koupon(x){
            try{
                var fd = ( !$.browser.chrome?    window.open('','koupon'):$('#tmp')[0].contentWindow);//fd.open();
                fd.document.write('<html><head><style>' + $('#style').html()+'</style></head><body id="body" onload="self.print()">'
                    + $('#xtitle').html()
                    + '<img class="banner" src="/images/koupon/'+x+'.jpg"><br> '
                    + '</body></html>');
                fd.document.close();
            } catch(e) {
                alert('Всплывающие окна заблокированы! Разрешите всплывающие окна для нормального функционирования.');
            }
         }

Как можно заметить, с основного текста выковыривается нужный стиль, нужный текст и нужный банер. Все это добро и предлагается печатать. 
#tmp - это скрытый фрейм, который для хрома позволяет не выводить окно.

Все работает относительно прилично для Хрома - нового окна не выводится, печатается то что надо.
 Для нехрома выводится отдельное всплывающее окно. Если они разрешены - проблем нет, за исключением дополнительного клика по кнопке закрытия окна.  Однако если они заблокированы (стандарт для IE) возникают досадные вопросы и нудные объяснения. 

Как еще можно решить задачу вывода на принтер?

Автор: Aliance 3.4.2013, 14:44
Цитата(ksnk @  3.4.2013,  14:49 Найти цитируемый пост)
$('#tmp')[0].contentWindow

А #tmp это что?

Зачем вообще разделять на хром и не хром. В 99% это же не правильно, проверять по браузеру (костыль).
В интернете говорят, что Хром тупит с этой функцией и предлагают в качестве решения:
Код

setTimeout("window.print()", 500);


Что если вместо нового окна ( window.open ) генерировать ифрейм?

Автор: ksnk 3.4.2013, 14:55
Цитата(Aliance @  3.4.2013,  14:44 Найти цитируемый пост)
А #tmp это что?

Зачем вообще разделять на хром и не хром. В 99% это же не правильно, проверять по браузеру (костыль).

#tmp = это скрытый фрейм
Код

<iframe id="tmp" style="display:none;"></frame>

Штука в том, что таким образом в хроме - "правильно" работает. Зато в остальных - нет и приходится пользоваться всплывающими окнами, которые нужно потом отдельно закрывать.
Отказываться от "правильно" работающей фичи в пользу универсального, но "неправильного" не считаю разумным ;)

Дело в том, что в остальных броузерах (IE, FF, Opera) печатается не текст во фрейме, а весь текст страницы. А вот в хроме - то, что находится во фрейме. Сам код срабатывает везде, разница в реализации .print.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)