Печать определенного блока страницы
Нет ничего сложного в том, чтобы распечатать всю страницу так как нам это надо. Просто подключаем стили для печати, в которых убираем все лишнее и вперед. А что делать если на странице одновременно присутствуют две кнопочки: одна печатает всю страницу, а вторая - какой-то выбранный блок?
Решение достаточно простое.
Допустим, у нас есть две ссылки: “Print block” и “Print page”. Заранее скажу что будет использоваться jquery, т.к. на сегодняшний день я себе не представляю нормального проекта без его участия.
При нажатии на “Print block” срабатывает функция:
1 2 3 4 5 6 7 8 9 10 11 | function printBlock(printLink) { productDesc = $(printLink).parents('#blockId').html();//забираем контент нужного нам блока (в моем случае ссылка на печать находится внути его) $('body').addClass('printSelected');//добавляем класс к body $('body').append('<div class="printSelection">' + productDesc + '</div>');//создаем новый блок внутри body window.print();//печатаем window.setTimeout(pageCleaner, 0); //очищаем нашу страницу от "мусора" return false;//баним переход по ссылке, чтобы она не пыталась перейти по адресу, указанному внутри аттрибута href } |
Функция pageCleaner() вызывается через setTimeout затем, чтобы поставить ее вызов в очередь. Чтобы распечатка не произошла после очистки и вместо нужного блока распечаталась вся страница.
Вот сама очистка:
1 2 3 4 5 | function pageCleaner() { $('body').removeClass('printSelected');//убираем класс у body $('.printSelection').remove();//убиваем наш только что созданный блок для печати } |
Воть тяк. Конечно, можете спросить, почему бы не поставить очистку на нажатие ссылки “Print page”. Да потому что пользователь может возжелать распечатать страницу через “Файл” -> “Печать”
Ну и не забыть прописать в файл стилей для печати следующее:
1 2 3 | .printSelected div {display: none } /* скрываем весь контент на странице */ .printSelected div.printSelection {display: block; } /* делаем видимым только тот блок, который подготовлен для печати */ .printSelected div.printSelection div {display: block; } /* показываем всех его потомков, которые были скрыты первой строкой */ |
Вот так. Просто, но тем не менее работает :)
Как повесить вызов функции printBlock() на нужную ссылку, расписывать, надеюсь, не надо? :)

Февраль 1st, 2011 в 22:06
Почему то в опере не запускается окно печати :(
Март 20th, 2011 в 14:11
было бы круто сразу демку прикладывать
Апрель 5th, 2011 в 17:20
Да, в опере не фурычит, и предолагаю -из за ее особенности работы функции print() -поскольку нужно функцию вызывать на onload страници
Ноябрь 24th, 2011 в 09:26
И все-таки, не подскажете начинающему, как повесить вызов функции printBlock на нужную ссылку?)
Декабрь 1st, 2011 в 15:42
На Ява можно это как то организовать!? И вообще, можно ли это сделать на ucoz например? Не могу найти ничего (((