Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сделать "распечатку"

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
ПТО
Отправлено: 27 Декабря, 2013 - 10:23:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 395
Дата рег-ции: Янв. 2012  


Помог: 3 раз(а)




Что нужно:
при клике на .printButton страничка (первые дочерние элементы <body>) скрывается. Затем нужный элемент выносится в <body> - поэтому он единственный, который отображается. Больше ничего не нужно.
Что есть:
CODE (javascript):
скопировать код в буфер обмена
  1. $('.printButton').live('click', function() {
  2.     print($(this).attr('print'));
  3.     return false;
  4. });
  5. function print(elem) {
  6.     $('body').children().each(function() {
  7.         $(this).css('display', 'none');
  8.     });
  9.     $('body').append($('#' + elem));
  10.  
  11.     $(document).on('click.myClick', function() {
  12.         $(document).off('click.myClick');
  13.         $('body').remove($('#' + elem));
  14.         $('body').children().each(function() {
  15.             $(this).css('display', '');
  16.         });
  17.     });
  18.  
  19. }

Что не получается:
Элемент исчезает (remove). Хотелось бы чтобы когда
$('body').append($('#' + elem));
- создавалась копия, и она добавлялась к body (возможно с class="temporary"), и потом по этому классу remove.
А изначальный dom-элемент оставался на своем месте.

1) Что надо подправить?
2) Есть ли другие простые способы реализации "распечатки"?
Растерялся
 
 Top
Deonis
Отправлено: 27 Декабря, 2013 - 10:34:36
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




ПТО пишет:
1) Что надо подправить?
Для начала - забыть про метод live(), тем более, что вы уже начали применять on().
ПТО пишет:
2) Есть ли другие простые способы реализации "распечатки"?
Хотелось бы понять саму суть манипуляций. Тогда и решение найдется быстро. Вы хотите оставлять только определенный блок для вывода его на печать?
 
 Top
ПТО
Отправлено: 27 Декабря, 2013 - 10:38:01
Post Id



Посетитель


Покинул форум
Сообщений всего: 395
Дата рег-ции: Янв. 2012  


Помог: 3 раз(а)




1) Про live я в курсе. Не суть
2)
Deonis пишет:
Вы хотите оставлять только определенный блок для вывода его на печать
Да.. В принципе, по коду прослеживается. При повторном клике в любом месте - все возвращается как было (для этого и есть off)

(Отредактировано автором: 27 Декабря, 2013 - 10:40:03)

 
 Top
Deonis
Отправлено: 27 Декабря, 2013 - 10:51:50
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




ПТО пишет:
При повторном клике в любом месте - все возвращается как было
Смотрите такой вариант.

(Отредактировано автором: 27 Декабря, 2013 - 10:52:48)

 
 Top
ПТО
Отправлено: 27 Декабря, 2013 - 12:01:53
Post Id



Посетитель


Покинул форум
Сообщений всего: 395
Дата рег-ции: Янв. 2012  


Помог: 3 раз(а)




Deonis, спасибо! Но я считаю, что stopImmediatePropagation - чем дальше в лес тем больше дров
Остановился на таком варианте:
CODE (javascript):
скопировать код в буфер обмена
  1. $(document).on('click', '.printButton', function() {
  2.     print($(this).attr('print'));
  3.     return false;
  4. });
  5. function print(elem) {
  6.     var html = document.getElementsByTagName('html')[0];
  7.     var body = document.getElementsByTagName('body')[0];
  8.     var children = body.childNodes;
  9.     for (var i = 0; i < children.length; i++) {
  10.         children[i].style ? children[i].style.display = 'none' : null;
  11.     }
  12.  
  13.     var printElem = document.getElementById(elem);
  14.     var temporary = printElem.cloneNode(true);
  15.     var printButton = temporary.getElementsByClassName('printButton')[0];
  16.     printButton ? printButton.parentNode.removeChild(printButton) : null;
  17.     body.appendChild(temporary);
  18.  
  19.     body.style.height = 'auto';
  20.     body.style.width = 'auto';
  21.     html.style.background = 'white';
  22.  
  23.     $(document).on('click.myClick', function() {
  24.         $(document).off('click.myClick');
  25.         temporary.parentNode.removeChild(temporary);
  26.         for (var i = 0; i < children.length; i++) {
  27.             children[i].style ? children[i].style.display = '' : null;
  28.         }
  29.         body.style.height = '';
  30.         body.style.width = '';
  31.         html.style.background = '';
  32.     });
  33.  
  34. }

Единственное, меня смущает "порядочность" использования тернарного оператора "?" для выполнения скрипта, и заглушки в виде "null"
 
 Top
KingStar
Отправлено: 27 Декабря, 2013 - 14:45:13
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




2) Есть ли другие простые способы реализации "распечатки"?

создаешь файл стилей print.css вида

CODE (htmlphp):
скопировать код в буфер обмена
  1. #header
  2. {
  3.         display: none !important;
  4. }


на требуемые спрятать блоки и подружаешь к странице


-----
То что программа работает, не означает что она написана правильно!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB