Печать при переполнении текстовой области - PullRequest
39 голосов
/ 14 декабря 2010

У меня есть форма с некоторыми текстовыми областями, которые позволяют полосу прокрутки, когда текст превышает текстовое поле. Пользователь хотел бы иметь возможность распечатать экран, и этот текст не виден. Как сделать весь текст видимым для простой печати? Мне лучше сделать ссылку на печать в PDF или что-то в этом роде?

Ответы [ 10 ]

65 голосов
/ 06 января 2011

Вы не можете решить эту проблему только с помощью CSS.

Почему Pure-CSS-решений недостаточно (с демонстрацией)

Позвольте мне убедить вас, что ответов с использованием таблиц стилей печати и overflow: visible недостаточно. Откройте эту страницу и посмотрите на источник. Только то, что они предложили, верно? Теперь распечатайте предварительный просмотр (скажем, в Chrome 13 на OS X, как я). Обратите внимание, что вы можете видеть только одну или две строки заметки при попытке печати!

Вот снова URL для моего теста: https://alanhogan.github.io/web-experiments/print_textarea.html

Решения:

  1. Ссылка JavaScript, которая открывает новое окно и записывает в него содержимое текстовой области для печати. Или:

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

  3. (Если ваш textarea только для чтения, то также возможно решение на стороне сервера.)

Обратите внимание, что textarea обрабатывают пробелы иначе, чем HTML по умолчанию, поэтому вам следует рассмотреть возможность применения CSS white-space: pre-wrap; в новом открытом окне или к вашему помощнику div соответственно. IE7 и старше не понимают pre-wrap, поэтому, если это проблема, либо примите ее, либо используйте обходной путь для них. или сделать всплывающее окно фактически простым текстом, буквально обслуживаемым типом носителя text/plain (для которого, вероятно, требуется компонент на стороне сервера).

Решение «Print Helper» (с кодом + демо)

Я создал демо одного метода JavaScript .

Основная концепция заключается в копировании содержимого текстовой области в другой помощник по печати. Код следует.

HTML:

<textarea name="textarea" wrap="wrap" id="the_textarea">
</textarea>
<div id="print_helper"></div>

CSS (все / не для печати):

/* Styles for all media */
#print_helper {
  display: none;
}

CSS (печать):

/* Styles for print (include this after the above) */
#print_helper { 
    display: block;
    overflow: visible;
    font-family: Menlo, "Deja Vu Sans Mono", "Bitstream Vera Sans Mono", Monaco, monospace;
    white-space: pre;
    white-space: pre-wrap;
}
#the_textarea {
  display: none;
}

Javascript (с jQuery):

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">
jQuery(function($){
  function copy_to_print_helper(){
    $('#print_helper').text($('#the_textarea').val());
  }
  $('#the_textarea').bind('keydown keyup keypress cut copy past blur change', function(){
    copy_to_print_helper(); // consider debouncing this to avoid slowdowns!
  });
  copy_to_print_helper(); // on initial page load
});
</script>

Опять же, успешная демонстрация на основе JavaScript находится на https://alanhogan.github.io/web-experiments/print_textarea_js.html.

6 голосов
/ 14 апреля 2015

Перебирайте все текстовые области и перемещайте содержимое в держатель

    window.onbeforeprint = function () {
        $('.print-content').remove();
        $('textarea').each(function () {
            var text = $(this).val();
            $(this).after('<p class="well print-content">' + text + '</p>');
        });
    }

И используйте следующий CSS

.print-content {
  display: none !important;
}

@media print {
  .print-content {
    display: block !important;
  }
  textarea {display: none !important;}
}
4 голосов
/ 31 января 2011

Я недавно столкнулся с той же проблемой.Мое решение состояло в том, чтобы дублировать содержимое в элементы управления формой для редактирования и в div для печати.

В мою голову я положил таблицу стилей печати.

<link rel="stylesheet" href="printform.css" type="text/css" media="print" />

В printform.css я поместил следующее

.screenOnly { display: none; }
.printOnly { display: inline-block; }

Для текстовых полей (и других типов полей, которые вызывали проблемы) я использовал следующий код

<textarea class="screenOnly" name="myTextArea"><?php echo (htmlspecialchars ($_POST ['myTextArea'])); ?></textarea>
<div class="printOnly"><?php echo (htmlspecialchars ($_POST ['myTextArea'])); ?></div>

При отображении на экране текстовые области отображаются, а элементы, дублирующие их содержимое, скрыты.При печати действует обратное.

Я знаю, что вы уже выбрали ответ на этот вопрос, но хотя использование таблицы стилей для печати - хорошая идея, она не описывает конкретное решение.Настройка переполнения: видна в текстовой области (моя первая идея) не сработала, поэтому я решил использовать решение выше.Если у вас все еще есть трудности, я надеюсь, что это поможет вам

1 голос
/ 09 апреля 2014

Похоже, что это работает для применения ко всем элементам, которые имеют переполненный контент:

$("textarea").each(function () {
    var Contents = $(this).val();
    if ($(this)[0].scrollHeight > $(this).height()) {
        $(this).after("<div class='print-helper'>" + Contents + "</div>");
        $(this).addClass("no-print");
    }
});
1 голос
/ 28 февраля 2012

Только недавно решите проблему. Спасибо за сообщения Алана Х. Он отлично работает с Chrome и Safari. Однако в IE и Firefox проблема заключается в том, что последние несколько страниц (элементы страницы после textarea) будут отсутствовать при печати (FF), пропущенных страницах и наложенном макете (IE9).

Еще один вывод, который будет полезен для решения этой проблемы, заключается в том, что вы можете правильно задать свойства строк textarea, как говорит высота элемента управления, чтобы он работал с переполнением CSS: видимые вещи. Кажется, что все браузеры уважают свойство rows при печати. ​​

0 голосов
/ 15 апреля 2019

Добавление к Ответу Алана выше, если у вас есть несколько случаев этой проблемы на одной странице, то вы можете использовать атрибуты data- * для обработки всего сразу.Образец:

var $printOnlyArr = $('.print-only');
for (var i = 0; i < $printOnlyArr.length; i++) {
  var $printOnly = $($printOnlyArr[i]);
	var textSource = $printOnly.data('textsource');
	if (textSource) {
	  $printOnly.text($("#" + textSource).val());
	}
}
.print-only {
	display: none;
}

@media print {
	.print-only {
		display: block;
	}
	.no-print {
		display: none;
	}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea class="form-control no-print" maxlength="2000" id="txtAdditionalComments"></textarea>
<div class="print-only" data-textsource="txtAdditionalComments"></div>
0 голосов
/ 26 сентября 2017

При использовании чистого CSS невозможно подготовить текстовую область для печати.

Необходимо добавить магию javacript в текстовую область или добавить скрытое поле.

Существует несколько решений, которые были упомянуты здесь:

  1. Скрытый абзац или div
  2. Использование Javascript для расширения размера текстовой области

1.Скрытый абзац или div

HTML & CSS:

<textarea>Sample Text</textarea>
<div class="hidden-div">Sample Text</div>

<style>
  .hidden-div{display: none;}
  @media print{
    .hidden-div{display:block;}
  }
</style>

2.Javascript

Вы можете использовать библиотеку js, например, https://github.com/thomasjo/jquery-autoresize

$(function() {
    $("textarea").autoResize()
})
0 голосов
/ 12 августа 2016

Это легко исправить с помощью CSS, учитывая, что большинству пользователей на самом деле не нужно печатать немного лишнего пробела. Просто укажите минимальную высоту для текстовых полей при печати:

@media print { 
textarea {
min-height: 500px;  
}
}

Пометьте это на конце вашего CSS с минимальной высотой, которая достаточно удобна, когда вы смотрите на нее в режиме предварительного просмотра.

0 голосов
/ 09 января 2012

Я использую это в моем стиле:

PRE.print {
display:none;
}

@media print {

  TEXTAREA {
    display:none;
  }

  PRE.print {
    display:block;
    width:90%; /* fixes margin issues in some funky browsers */
    white-space: pre-wrap;       /* css-3 */
    white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
    white-space: -pre-wrap;      /* Opera 4-6 */
    white-space: -o-pre-wrap;    /* Opera 7 */
    word-wrap: break-word;       /* Internet Explorer 5.5+ */
    font-family:monospace,sans;
  }

}

Затем, после каждого TEXTAREA, я использую PRE с классом «print» следующим образом:

<code><textarea id="message" name="message" rows="10" cols="80" onblur="updatePrint('#message')"><?= $MESSAGE ?></textarea>
<pre id="message-print" class="print">
<?= $MESSAGE ?>

... обратите внимание на PHP, который я использовал - вы можете переключаться с вашим языком программирования. И затем этот код выше нуждается в следующей функции, при условии, что у вас загружена библиотека jQuery:

<script type="text/javascript">

function updatePrint(sID) {
  $(sID + '-print').text($(sID)[0].value);
}

</script>

Как все это работает

Способ, которым это работает, заключается в том, что я в основном загружаю содержимое на страницу дважды, но использую таблицу стилей, чтобы скрыть содержимое, не подходящее для принтера, такого как TEXTAREA.

Вы можете изменить стиль PRE по своему желанию. Однако я использую monospace на случай, если кто-то захочет напечатать HTML-код, который он напечатал в поле, и захотел, чтобы он хорошо форматировался.

Событие onblur помогает выявить необходимость обновления соответствующего PRE.

Обратите внимание, что вы также можете выполнять работу с таблицей стилей через атрибут media для ссылки rel в разделе HEAD вашего HTML, используя такие вещи, как media = "all not print" и media = "print".

0 голосов
/ 14 декабря 2010

Определите отдельный CSS для печатных носителей, например <link rel="stylesheet" href="print.css" type="text/css" media="print" />, а для текстовой области определите атрибут переполнения как

overflow: visible;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...