Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод на печать. Javascript 
:(
    Опции темы
ksnk
Дата 3.4.2013, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



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

Стандарное решение - печать идет функцией 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) возникают досадные вопросы и нудные объяснения. 

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Aliance
Дата 3.4.2013, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



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

А #tmp это что?

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

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


Что если вместо нового окна ( window.open ) генерировать ифрейм?
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 3.4.2013, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



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

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

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

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

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

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.