Только печать <div id = "printarea"> </div>?

Как распечатать указанный div (не отключая вручную все остальное содержимое на странице)?

Я хочу избежать появления нового диалогового окна предварительного просмотра, поэтому создание нового окна с этим содержимым бесполезно.

Страница содержит несколько таблиц, одна из них содержит div, который я хочу распечатать - таблица оформлена с использованием визуальных стилей для Интернета, которые не должны отображаться при печати.

stackoverflow.com/questions/2255291/… эта ссылка работает отлично
Jinna Balu 13.03.2017 21:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
477
1
765 873
30
Перейти к ответу Данный вопрос помечен как решенный

Ответы 30

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

У меня есть таблица стилей для печати - я стараюсь не помещать правила стиля во все остальное содержимое ...

noesgard 22.01.2009 15:18

У меня есть таблица со стилями, содержащая рассматриваемый div. Если я установлю отображение таблицы: нет - могу ли я отображать div?

noesgard 22.01.2009 15:27

Думаю, да, и вы могли бы попробовать пометить правило как! Важно, чтобы усилить его!

Paul Dixon 22.01.2009 15:46

если таблица не отображается, это не имеет значения, даже если для div установлено значение «display: awesome;». Родитель скрыт, как и дети. Это ситуация, когда вам нужна таблица или это просто для макета страницы?

roborourke 22.01.2009 20:29

"Бум, выстрел в голову!" по раскладке стола. = |

ANeves thinks SE is evil 05.05.2010 17:03

хм ... используйте тип таблицы стилей для печати ... в:

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

print.css:

div { display: none; }
#yourdiv { display: block; }

Это не сработает, если документ не основан на DIV или #yourdiv также включает дополнительные DIV.

Gumbo 22.01.2009 15:18

#yourdiv * {display: ...} если вы разместите это вверху страницы и у вас будет современный браузер, вы можете работать с другими селекторами, чтобы скрыть не div

user57508 22.01.2009 15:20

"#yourdiv * {display: ...}" - что должно быть ... без нарушения макета?

Greg 22.01.2009 15:21

Это отобразит встроенные элементы также как блочные. Но «#yourdiv, #yourdiv div {display: block}» сделает это.

Gumbo 22.01.2009 15:23

@dittodhole - задумайтесь на минутку. Что вы могли бы добавить туда, чтобы не нарушить макет в #yourdiv?

Greg 22.01.2009 15:30

обкатка - но не поддерживается обычными браузерами. только рабочие значения: inline, block и none (элемент списка с ie> 5). так что я бы сказал: это зависит от макета! но я бы предпочел решение Gumbo с моим представлением о незнании того, что на странице

user57508 22.01.2009 15:35

Проблема в том, что практически в любом макете есть сочетание блочного и встроенного. Даже что-то очень простое вроде этого: <p> Это <b> </b> не работает. </p> <p> Если вы выберете встроенный <b> или </b> блок </p>

Greg 22.01.2009 15:38

поэтому я хотел бы создать 2 разных материнских блока, как здесь stackoverflow.com/questions/468881/…

user57508 22.01.2009 15:45

@downvoter: постарайтесь уточнить, чтобы я мог исправить свой ответ?

user57508 29.02.2016 17:05

Используйте специальную таблицу стилей для печати

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

а затем добавьте класс, то есть «noprint», к каждому тегу, содержимое которого вы не хотите печатать.

В CSS используйте

.noprint {
  display: none;
}

Вы можете использовать отдельный стиль CSS, который отключает любой другой контент, кроме контента с идентификатором printarea.

См. CSS-дизайн: готовимся к печати для дальнейших объяснений и примеров.

Обновлена ​​ссылка на новое место. Комментарий вместо отрицательного было бы неплохо.

Kosi2801 23.09.2014 09:21

С CSS 3 вы можете использовать следующее:

body *:not(#printarea) {
    display: none;
}

Не могу использовать это, боюсь ... (поправьте меня, если ошибаюсь) страница, над которой я работаю, - asp.net 1.1 / DHTML

noesgard 22.01.2009 15:18

Это зависит от браузера, доступен ли уже селектор: not () или нет.

Gumbo 22.01.2009 15:21

Что ж, тогда мое предложение - это просто заглянуть в будущее… Нет, серьезно. Я просто упомянул об этом для полноты картины. Я знаю, что сейчас это невозможно. К несчастью.

Gumbo 22.01.2009 15:26

Вы можете использовать jQuery и этот селектор, который (я думаю) будет работать в IE6 - $ ('body *: not (#printarea)'). Style ('display', 'none');

David Heggie 22.01.2009 17:28

это скроет всех потомков #printarea, поскольку им соответствует *: not (#printarea). Таким образом, вы получаете пустой контейнер.

cytofu 11.06.2015 01:38

Все ответы на данный момент довольно ошибочны - они либо включают добавление class = "noprint" ко всему, либо испортят display в #printable.

Я думаю, что лучшим решением было бы создать оболочку вокруг непечатаемого материала:

<head>
    <style type = "text/css">

    #printable { display: none; }

    @media print
    {
        #non-printable { display: none; }
        #printable { display: block; }
    }
    </style>
</head>
<body>
    <div id = "non-printable">
        Your normal page contents
    </div>

    <div id = "printable">
        Printer version
    </div>
</body>

Конечно, это не идеально, так как требует небольшого перемещения вещей в вашем HTML ...

Я думаю, что вы правы, но как мне убить стиль таблицы, окружающей div (если это возможно, чтобы удалить стиль - я могу распечатать таблицу и довольно легко исключить остальной контент

noesgard 22.01.2009 15:32

Я использую Javascript для получения необходимого контента и CSS, как указано выше.

noesgard 03.02.2009 16:07

Я предпочитаю использовать семантический HTML. Форматирование печати в идеале должно выполняться с помощью CSS. См. Мой ответ, как это сделать: stackoverflow.com/questions/468881/…

Bennett McElwee 12.04.2010 02:42

Согласитесь с Беннеттом, использование видимости вместо отображения - гораздо более чистое решение.

guigouz 27.05.2011 06:33

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

Kevin Florida 23.09.2011 21:42

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

Casey 20.01.2015 21:47

@emodendroket Совершенно верно, если вы хотите делать динамические вещи, вам понадобится JavaScript. Используя, например, мое решение, вы можете использовать JS для присвоения идентификатора section-to-print той части страницы, которую вы хотите распечатать. Это касается динамического аспекта. Затем CSS позаботится об аспекте представления (печати), как и должно.

Bennett McElwee 21.01.2015 00:14

@BennettMcElwee Конечно. Я согласен, но не понимаю, чем это отличается от этого ответа.

Casey 21.01.2015 00:15

@emodendroket Этот ответ требует, чтобы вы определенным образом структурировали страницу и создали отдельную «версию для принтера», которая вообще не отображается на экране. (Таким образом, он даже не отвечает на вопрос ОП!)

Bennett McElwee 21.01.2015 00:32

@BennettMcElwee О, я понимаю, о чем вы. Да, вы правы, что стилизованное тело как скрытое, вероятно, чище.

Casey 21.01.2015 00:33

Если вы хотите распечатать только этот div, вы должны использовать инструкцию:

@media print{
    *{display:none;}
    #mydiv{display:block;}
}

Я взял контент с помощью JavaScript и создал окно, которое можно было распечатать вместо ...

Можете ли вы поделиться кодом, у него проблема с принятием css

Moxet Khan 21.04.2016 16:38
  1. Дайте любому элементу, который вы хотите распечатать, идентификатор printMe.

  2. Включите этот скрипт в свой заголовок:

    <script language = "javascript">
        var gAutoPrint = true;
    
        function processPrint(){
    
        if (document.getElementById != null){
        var html = '<HTML>\n<HEAD>\n';
        if (document.getElementsByTagName != null){
        var headTags = document.getElementsByTagName("head");
        if (headTags.length > 0) html += headTags[0].innerHTML;
        }
    
        html += '\n</HE' + 'AD>\n<BODY>\n';
        var printReadyElem = document.getElementById("printMe");
    
        if (printReadyElem != null) html += printReadyElem.innerHTML;
        else{
        alert("Error, no contents.");
        return;
        }
    
        html += '\n</BO' + 'DY>\n</HT' + 'ML>';
        var printWin = window.open("","processPrint");
        printWin.document.open();
        printWin.document.write(html);
        printWin.document.close();
    
        if (gAutoPrint) printWin.print();
        } else alert("Browser not supported.");
    
        }
    </script>
    
  3. Вызов функции

    <a href = "javascript:void(processPrint());">Print</a>
    

Это хорошая работа. Но это слишком сложно и не будет работать должным образом в разных браузерах (особенно в старых браузерах). Предлагаю вам взглянуть на мое решение ниже.

Kevin Florida 23.09.2011 21:20

Метод Сандро отлично работает.

Я настроил его, чтобы разрешить использование нескольких ссылок printMe, в частности, для использования на страницах с вкладками и расширении текста.

function processPrint(printMe){ <- здесь вызов переменной

var printReadyElem = document.getElementById(printMe); <- удалены кавычки вокруг printMe для запроса переменной

<a href = "javascript:void(processPrint('divID'));">Print</a> <- передача идентификатора div для печати в функцию для преобразования переменной printMe в идентификатор div. одинарные кавычки необходимы

С jQuery это так просто:

w=window.open();
w.document.write($('.report_left_inner').html());
w.print();
w.close();

Это довольно круто, хотя в Chrome оно отображается как заблокированное всплывающее окно.

Rafi Jacoby 10.06.2011 01:40

Хитрость заключается в том, чтобы вызвать его по событию, создаваемому пользователем, например по щелчку мыши. вы также можете добавить после первой строки: if (! w) alert ('Пожалуйста, разрешите всплывающие окна');

romaninsh 10.06.2011 02:54

Определенно добавляю это в свой инструментарий. Это быстрое и простое решение.

None 03.09.2012 08:29

OP не хотел включать веб-стили, но я полагаю, мы можем добавить несколько тегов <style>

romaninsh 12.03.2013 16:13

у кого-нибудь это работает на IE11? Он просто открывает окно, а затем сразу его закрывает. Хотя работает в Chrome, FF и сафари.

greatwitenorth 07.07.2015 00:17

Спасибо, но у меня есть вопрос. Все объекты на странице действуют как слева направо. Есть ли способ предотвратить это? @romaninsh

Koray Durudogan 29.01.2016 12:14

Я потерял css при печати с этим, есть ли способ сохранить css?

Moxet Khan 21.04.2016 13:10

@MoxetKhan, в этом посте есть решение с css vevlo.com/how-to-print-div-content-using-javascript

lakesare 29.04.2018 13:56

Это хорошо работает:

<style type = "text/css">
@media print
{
body * { visibility: hidden; }
#printcontent * { visibility: visible; }
#printcontent { position: absolute; top: 40px; left: 30px; }
}
</style>

Обратите внимание, что это работает только с «видимостью». "display" этого не сделает. Проверено в FF3.

В Chrome это увеличивает количество печатаемого контента.

fathergorry 05.07.2020 13:58
Ответ принят как подходящий

Вот общее решение с использованием Только CSS, которое, как я убедился, работает.

@media print {
  body * {
    visibility: hidden;
  }
  #section-to-print, #section-to-print * {
    visibility: visible;
  }
  #section-to-print {
    position: absolute;
    left: 0;
    top: 0;
  }
}

Альтернативные подходы не так хороши. Использование display сложно, потому что, если какой-либо элемент имеет display:none, то ни один из его потомков не будет отображаться. Чтобы использовать его, вы должны изменить структуру своей страницы.

Использование visibility работает лучше, поскольку вы можете включить видимость для потомков. Однако невидимые элементы по-прежнему влияют на макет, поэтому я перемещаю section-to-print в верхний левый угол, чтобы он печатался правильно.

#section_to_print должен работать лучше с position:static; вместо position:absolute;
vitto 24.01.2011 17:22

Как лучше? Возможно, многостраничная печать?

Bennett McElwee 08.02.2011 01:39

это, безусловно, самый быстрый и чистый способ, мне интересно, почему этот ответ не получил наибольшее количество голосов -.-

Dany Khalife 07.11.2011 01:14

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

Malcolm MacLeod 17.05.2013 09:52

Вы правы: если контент занимает несколько страниц, будьте осторожны с CSS. И протестируйте во всех возможных браузерах. : \

Bennett McElwee 17.05.2013 13:36

Это отличное начало, но у меня было две проблемы: во-первых, если какой-либо из родителей элемента установил свое собственное относительное / абсолютное позиционирование, содержимое все равно будет смещено, если вместо этого я не использовал position:fixed. Однако Chrome и Safari также будут обрезать контент, особенно после первой страницы. Итак, мой последний обходной путь состоял в том, чтобы установить для целевого а такжевсе его родители значение overflow:visible; position:absolute !important; top:0;left:0.

natevw 14.12.2013 02:00

@Bennett благодарит за это отличное решение. Но при печати я получаю лишнюю пустую страницу. Как этого избежать?

sanjeev 08.05.2014 21:27

@sanjeev Первый шаг: результаты тестирования в различных браузерах, чтобы увидеть, зависит ли проблема от браузера.

Bennett McElwee 09.05.2014 01:35

@Bennett Проблема не зависит от браузера. Я вижу это в Chrome, FF и IE.

sanjeev 09.05.2014 20:31

@sanjeev Я создал минимальный Plunk, который у меня работает в Chrome (он распечатывает одну страницу). Может быть, вы могли бы создать Plunk, который демонстрирует проблему, и мы могли бы выяснить, что происходит.

Bennett McElwee 12.05.2014 05:07

Это гениальная работа, так рада, что она сработала как шарм всего за 2 минуты! Шикарная работа :)

Aditya P Bhatt 15.05.2015 16:39

Любопытно, почему раздел для печати должен присутствовать дважды?

dudeNumber4 13.07.2015 16:11

@ dudeNumber4 Второе правило делает видимым раздел печати и его содержимое. Третье правило перемещает раздел печати в верхний левый угол. Вы можете реорганизовать правила, чтобы уменьшить дублирование селектора, но вместо этого вам придется дублировать объявление видимости.

Bennett McElwee 14.07.2015 00:09

@BennettMcElwee Нет, я имею в виду, почему второе правило должно дважды ссылаться на селектор Id?

dudeNumber4 14.07.2015 17:06

@ dudeNumber4 #section-to-print соответствует самому разделу; #section-to-print * соответствует каждому подэлементу раздела. Таким образом, это правило просто делает раздел и все его содержимое видимым.

Bennett McElwee 15.07.2015 00:54

@BennettMcElwee: Что, если div раздела для печати находится в правом нижнем углу страницы? И позиция div является относительной, что означает, что она регулируется в соответствии с размером страницы?

Vicky 29.09.2015 16:26

@Vicky При печати он переместится в верхний левый угол.

Bennett McElwee 30.09.2015 08:08

Как отмечалось выше, это не работает на более сложных страницах с большим количеством контента. Если вам нужно полностью заблокировать отображение содержимого с помощью display: none, вам может быть лучше с решением js

ilektron 12.03.2016 23:56

Вы можете попробовать решение на JavaScript, но это не сработает, если ваш пользователь использует команду браузера «Печать».

Bennett McElwee 15.03.2016 03:37

Но он избегает стилей css из внешнего файла начальной загрузки.

mpsbhat 03.08.2016 03:11

Он все еще использует стили Bootstrap. Bootstrap устанавливает черный цвет текста при печати с помощью правила в print.less.

Bennett McElwee 03.08.2016 03:49

Вы можете объяснить, как я использую это на своей странице? У меня есть мастер-файл CSS

James Wierzba 10.08.2016 17:25

@JamesWierzba (Не уверен, что вы имеете в виду под основным файлом CSS) Поместите фрагмент CSS в свой файл CSS и измените #section-to-print на селектор, который выбирает раздел, который вы хотите распечатать.

Bennett McElwee 11.08.2016 01:48

Спустя 6 лет это все еще остается идеальным решением. Я использовал это в приложении AngularJS с window.print (), и у меня не было проблем.

Alex 09.09.2016 18:28

Я попробовал это, и это сработало, но я не понимаю, как это сделать. Я не применял # section-to-print ни к чему в моем html. Как именно это может напечатать именно то, что мне нужно?

ArtisanSamosa 13.12.2016 20:03

Вполне возможно, что бит, который вы хотели, уже имел visibility: visible, установленный каким-либо другим CSS.

Bennett McElwee 14.12.2016 02:08

Я чувствую, что body *:not(#section-to-print *) {visibility: hidden;} был бы более элегантным, поскольку не требовал бы перезаписи дважды. Однако для меня это, похоже, совсем не работает. Ну что ж.

Bryan 19.03.2017 09:02

Если в разделе для печати есть абсолютно размещенные элементы, вы должны сделать их скрытыми в разделе печати мультимедиа CSS, чтобы это решение работало. Компонент Material Design LiteTextField является примером этой проблемы.

Lambert 09.08.2017 15:51

Я немного улучшил его, если вы хотите скрыть печатные материалы. #section-to-print{ visibility:hidden; height:0px; } @media print { body * { visibility: hidden; } #section-to-print, #section-to-print * { visibility: visible; } #section-to-print { position: absolute; left: 0; top: 0; } }

Shah Abaz Khan 13.11.2017 12:38

@ShahAbazKhan Если вы хотите скрыть печатные материалы на экране, возможны более простые решения. Но это немного странно: это означает, что вы что-то увидите на экране, выберите «Печать», и на вашем принтере появится что-то совсем другое.

Bennett McElwee 14.11.2017 01:33

Это не удается, когда мы используем div с полосой прокрутки

Jeevan Roy dsouza 26.10.2018 07:32

@JeevanRoydsouza, можешь привести пример?

Bennett McElwee 26.10.2018 07:43

Когда у нас есть раздел для печати в @media print с .section-to-print, .section-to-print * {visibility: visible; } .section-to-print {позиция: фиксированная; слева: 0; верх: 0; дисплей: блок; ширина: авто; переполнение-y: прокрутка; } и внешняя печать css .section-to-print {height: 80%; переполнение-y: прокрутка; граница: сплошной серый 1px; }

Jeevan Roy dsouza 26.10.2018 07:50

Когда у нас есть раздел для печати, это div с полосой прокрутки, тогда полоса прокрутки не появляется на странице печати

Jeevan Roy dsouza 26.10.2018 07:52

Чтобы скрыть область печати, используйте: @media screen {# section-to-print {display: none; }}

svenema 08.01.2020 21:03

Спасибо, это потрясающе

Osama 30.04.2020 22:32

printDiv (divId): обобщенное решение для печати любого div на любой странице.

У меня была аналогичная проблема, но я хотел (а) иметь возможность распечатать всю страницу или (б) распечатать любую из нескольких конкретных областей. Мое решение, благодаря большей части вышеперечисленного, позволяет вам указать любой объект div для печати.

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

Сначала создайте необходимый print css, чтобы все подавить (но без конкретного правила, разрешающего элемент, который вы хотите распечатать).

<style type = "text/css" media = "print">
   body {visibility:hidden; }
   .noprintarea {visibility:hidden; display:none}
   .noprintcontent { visibility:hidden; }
   .print { visibility:visible; display:block; }
</style>

Обратите внимание, что я добавил новые правила класса:

  • noprintarea позволяет подавить печать элементов в вашем div - как содержимого, так и блока.
  • noprintcontent позволяет подавить печать элементов в вашем div - контент подавляется, но выделенная область остается пустой.
  • Распечатать позволяет вам иметь элементы, которые отображаются в печатной версии, но не на странице экрана. Обычно для стиля экрана у них будет "display: none".

Затем вставьте три функции JavaScript. Первый просто включает и выключает таблицу стилей для печатных материалов.

function disableSheet(thisSheet,setDisabled)
{ document.styleSheets[thisSheet].disabled=setDisabled; }   

Второй делает реальную работу, а третий потом убирает. Второй (printDiv) активирует таблицу стилей носителя для печати, затем добавляет новое правило, разрешающее печать нужного div, выдает печать, а затем добавляет задержку перед окончательной уборкой (в противном случае стили могут быть сброшены до того, как печать будет фактически выполнена. Выполнено.)

function printDiv(divId)
{
  //  Enable the print CSS: (this temporarily disables being able to print the whole page)
  disableSheet(0,false);
  //  Get the print style sheet and add a new rule for this div
  var sheetObj=document.styleSheets[0];  
  var showDivCSS = "visibility:visible;display:block;position:absolute;top:30px;left:30px;";
  if (sheetObj.rules) { sheetObj.addRule("#"+divId,showDivCSS); }
  else                { sheetObj.insertRule("#"+divId+"{"+showDivCSS+"}",sheetObj.cssRules.length); }
  print();
  //  need a brief delay or the whole page will print
  setTimeout("printDivRestore()",100);  
}

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

function printDivRestore()
{
  // remove the div-specific rule
  var sheetObj=document.styleSheets[0];  
  if (sheetObj.rules) { sheetObj.removeRule(sheetObj.rules.length-1); }
  else                { sheetObj.deleteRule(sheetObj.cssRules.length-1); }
  //  and re-enable whole page printing
  disableSheet(0,true);
}

Единственное, что нужно сделать, - это добавить одну строку в процесс загрузки, чтобы стиль печати изначально был отключен, что позволяет печатать всю страницу.

<body onLoad='disableSheet(0,true)'>

Затем из любого места в документе вы можете распечатать div. Просто введите printDiv ("thedivid") с помощью кнопки или чего-то еще.

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

ПРИМЕЧАНИЕ. В моей реализации это должна быть первая таблица стилей. Измените ссылки листа (0) на соответствующий номер листа, если вам нужно сделать это позже в последовательности листов.

У меня есть лучшее решение с минимальным кодом.

Поместите свою печатную часть в div с таким идентификатором:

<div id = "printableArea">
      <h1>Print me</h1>
</div>

<input type = "button" onclick = "printDiv('printableArea')" value = "print a div!" />

Затем добавьте событие, подобное onclick (как показано выше), и передайте идентификатор div, как я сделал выше.

Теперь давайте создадим действительно простой javascript:

function printDiv(divName) {
     var printContents = document.getElementById(divName).innerHTML;
     var originalContents = document.body.innerHTML;

     document.body.innerHTML = printContents;

     window.print();

     document.body.innerHTML = originalContents;
}

Обратите внимание, насколько это просто? Ни всплывающих окон, ни новых окон, ни сумасшедшего стиля, ни JS-библиотек, таких как jquery. Проблема с действительно сложными решениями (ответ несложный и не то, о чем я говорю) заключается в том, что они НИКОГДА не будут переводиться во всех браузерах! Если вы хотите изменить стили, сделайте, как показано в отмеченном ответе, добавив атрибут media к ссылке на таблицу стилей (media = "print").

Без пуха, легкий, просто работает.

@Kevin, я пробую это для формы, но она печатает пустую форму (без данных), и мне нужно, чтобы заполненная форма была распечатана перед отправкой

Arif 15.03.2012 16:29

Это отлично работает в Firefox и Chrome. Почему-то IE зависает при открытии и записи содержимого.

vsingh 27.04.2012 23:38

@Kevin: Отличное решение .. Однако оно не захватывает цвета и стили фона? Он печатает только обычный текст. Возможны ли какие-либо модификации для получения цветов и стилей?

Anil Soman 28.08.2012 11:43

@asprin предупреждение! Это не беспорядок в коде. Использование innerHTML для уничтожения, а затем воссоздания всего тела подходит для простых страниц, но с более продвинутыми настройками (меню, слайд-шоу и т. д.) Он может стереть некоторые динамические поведения, добавленные другими скриптами.

Christophe 06.11.2012 22:31

Это решение не будет работать на любой сложной странице, где элементы в области печати зависят от стилей и / или положения родительских элементов. Если вы извлечете печатный div, он может выглядеть совершенно по-другому, потому что все родители теперь отсутствуют.

Andrei Volgin 18.12.2012 11:12

К сожалению, не работает в Chrome, если вы закроете окно предварительного просмотра печати и попытаетесь выполнить jQuery .click. Обидно, потому что код такой легкий.

rybo111 12.07.2013 00:36

@Kevin Большое спасибо. Это действительно решение моей проблемы. Не нужно возиться с моим кодом, отличный ответ! +1

Paramone 30.01.2014 18:05

Мне нравится этот подход, но я не хочу перезагружать весь дом только для печати. На сложной странице с «состоянием» это было бы очень сложно. Я был вдохновлен этим кодом и придумал альтернативу: github.com/mikeljames/printme

mike james 11.03.2014 21:18

@mike Вы ничего не перезагружаете, это строго манипулирует DOM. Вы сохраняете разметку в переменной, распечатываете страницу и возвращаете ее. Я понимаю, что вы не решаетесь сделать это, но важно понимать, что загрузка не происходит. Вы просто манипулируете DOM

Kevin Florida 20.03.2014 19:01

@KevinFlorida Когда я говорю «Перезагрузить», я, по сути, имею в виду перерисовку, дом работает медленно, использование CSS для скрытия элементов выполняется быстрее: stackoverflow.com/questions/2447309/…

mike james 20.03.2014 20:13

@Christophe: Моя страница на ASP.NET очень тяжелая и содержит много динамического контента. Несмотря на это, функция печати работает отлично. Сама идея проста и гениальна, спасибо Кевину Флориде!

Boris Gappov 07.05.2015 16:25

@BorisGappov - очень простой пример с одним событием щелчка, чтобы доказать мою точку зрения: jsfiddle.net/dc7voLzt Я скажу это еще раз: это не беспорядочный код! Проблема не в самом принте, а в восстановлении исходной страницы!

Christophe 07.05.2015 23:09

с этим решением, когда я нажимаю, чтобы распечатать страницу и закрывать окно предварительного просмотра, я не могу щелкнуть, чтобы снова напечатать, любая идея, почему print () работает только один раз? Я использую React с Redux.

DJeanCar 14.07.2016 00:59

@Kevin Я пробовал этот код, но у меня возникла одна проблема: разрывы страниц не работают при печати. У меня есть разрыв страницы после: всегда; в дочерних элементах print div, но print не имеет разрыва страницы :(

Nikhil Gaur 08.08.2016 10:36

Привет, @KevinFlorida. Я попробовал ваш код, и он работает только один раз. после закрытия и повторного нажатия кнопки отображается ошибка. Я использую vuejs2 Uncaught TypeError: не удалось выполнить «содержит» на «Узле»: параметр 1 не относится к типу «Узел».

Alyssa Reyes 11.04.2017 07:24

Если ваш html имеет тег select, он не отображает выбранный параметр во время печати.

Maulik 21.03.2018 12:45

Работает как шарм.

Chirag Patel 22.06.2018 16:38

Что, если я хочу отправить URL-адрес в кнопке и распечатать URL-адрес в формате PDF? Это возможно? Это для страницы архива. Примечание: я не хочу перенаправлять на отправляемый URL.

Alisha Lamichhane 08.04.2019 10:28

В моем случае это не сработало. У меня есть форма, которую нужно распечатать, и я попробовал твой трюк. Но это дает мне некоторые ошибки, такие как: Cannot set property 'onclick' of null и Uncaught (in promise) Error: Not enough parameters. Кстати, я на AngularJS

Srk95 22.11.2019 11:27

Я использовал location.reload (); в последней строке, чтобы исправить проблему onclick, и таким образом, ответ будет полностью быстрым и удовлетворительным для меня, спасибо

StudioX 14.12.2020 11:52

Я перепробовал все варианты, этот работает в Chrome. Чтобы убедиться, что переключатель обратно работает, следует использовать location.reload ()

John 29.12.2020 07:45

Большой простор для добавления стилей перед печатью и их последующего восстановления с помощью этого простого и понятного фрагмента кода. Прекрасно обрабатывает страницы, доставленные PHP. Может быть, поможет onfocus() location.reload(), когда диалог печати отменен.

Steve 27.01.2021 01:00

Это быстрое и хорошее решение для страниц маленького и среднего размера .. молодец !!

Thameem 22.02.2021 15:44

Вы можете использовать это: http://vikku.info/codesnippets/javascript/print-div-content-print-only-the-content-of-an-html-element-and-not-the-whole-document/

Или используйте свойство css visibility:visible и visibility:hidden вместе с @media print{}

'display: none' скроет все вложенные 'display: block'. Это не решение.

Шаг 1. Напишите в теге заголовка следующий код JavaScript.

<script language = "javascript">
function PrintMe(DivID) {
var disp_setting = "toolbar=yes,location=no,";
disp_setting+ = "directories=yes,menubar=yes,";
disp_setting+ = "scrollbars=yes,width=650, height=600, left=100, top=25";
   var content_vlue = document.getElementById(DivID).innerHTML;
   var docprint=window.open("","",disp_setting);
   docprint.document.open();
   docprint.document.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"');
   docprint.document.write('"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');
   docprint.document.write('<html xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "en">');
   docprint.document.write('<head><title>My Title</title>');
   docprint.document.write('<style type = "text/css">body{ margin:0px;');
   docprint.document.write('font-family:verdana,Arial;color:#000;');
   docprint.document.write('font-family:Verdana, Geneva, sans-serif; font-size:12px;}');
   docprint.document.write('a{color:#000;text-decoration:none;} </style>');
   docprint.document.write('</head><body onLoad = "self.print()"><center>');
   docprint.document.write(content_vlue);
   docprint.document.write('</center></body></html>');
   docprint.document.close();
   docprint.focus();
}
</script>

Шаг 2. Вызовите функцию PrintMe ('DivID') по событию onclick.

<input type = "button" name = "btnprint" value = "Print" onclick = "PrintMe('divid')"/>
<div id = "divid">
here is some text to print inside this div with an id 'divid'
</div>

Это тот самый! Использовал его для модального окна и галереи. После закрытия нет ошибок Javascript. Действительно полезно, особенно когда вы используете модальные окна, длина которых превышает одну страницу. Красиво завершает. Идеально подходит для людей, которые хотят распечатать в магазине.

TheWeeezel 14.12.2016 02:47

Мне в целом не понравился ни один из этих ответов. Если у вас есть класс (скажем, printableArea) и он является непосредственным потомком body, вы можете сделать что-то вроде этого в своем CSS-файле print:

body > *:not(.printableArea) {
    display: none;
}

//Not needed if already showing
body > .printableArea {
    display: block;
}

Тем, кто ищет printableArea в другом месте, вам нужно убедиться, что показаны родительские объекты printableArea:

body > *:not(.parentDiv),
.parentDiv > *:not(.printableArea) {
    display: none;
}

//Not needed if already showing
body > .printableArea {
    display: block;
}

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

Причина, по которой это решение работает, заключается в том, что вы не захватываете все элементы, а только непосредственных дочерних элементов тела и скрываете их. Другие решения ниже с отображением css скрывают все элементы, которые влияют на все внутри содержимого printableArea.

Я бы не стал предлагать javascript, поскольку вам понадобится кнопка печати, которую нажимает пользователь, а стандартные кнопки печати браузера не будут иметь такого же эффекта. Если вам действительно нужно это сделать, я бы сохранил html тела, удалил все ненужные элементы, распечатал, а затем добавил обратно html. Как уже упоминалось, я бы избежал этого, если бы вы могли, и использовал вариант CSS, как указано выше.

ПРИМЕЧАНИЕ. Вы можете добавить любой CSS в CSS для печати, используя встроенные стили:

<style type = "text/css">
@media print {
   //styles here
}
</style>

Или, как я обычно использую, это тег ссылки:

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

Что, если div, который вы хотите напечатать, не является «непосредственным потомком тела»? Я пытаюсь сделать это в vue.js .. Но при использовании принятого ответа у меня появляется много пустых страниц.

svenema 08.01.2020 23:47

@svenema, вы можете использовать любой CSS, какой захотите. Это был просто пример.

fanfavorite 09.01.2020 06:17

хм, тем не менее, когда я пробую это, действительно нет дополнительных пустых страниц, но div printableArea также не отображается; Когда я использую этот код, у меня остается только 1 пустая пустая страница.

svenema 09.01.2020 10:15

Я обнаружил, что это действительно так, потому что div printableArea не является прямым потомком тега body, когда я делаю его прямым потомком, ваше решение работает; однако в моем случае я не могу сделать printableArea прямым потомком. Это можно обойти?

svenema 09.01.2020 12:40

тем не менее ... когда div printableArea является нет прямым потомком тега body, я получаю только пустую страницу. Не могли бы вы опубликовать полностью рабочий пример?

svenema 09.01.2020 18:08

Если вы опубликуете свой пример в jsfiddle или в чем-то подобном, я могу помочь исправить.

fanfavorite 10.01.2020 19:18

Извините за задержку. Сайт не работал, когда у меня было время посмотреть, и я просто вернулся к этому. В основном вам нужно указать родительский элемент в вашем CSS. Что-то вроде jsfiddle.net/sn79fow1

fanfavorite 18.01.2020 01:21

Отличный материал, очень признателен! Я играл с ним несколько часов, изучая селекторы и псевдоклассы. Но я не смог понять, есть ли способ разместить printableArea в произвольном месте и по-прежнему печатать только этот конкретный класс.

svenema 18.01.2020 17:37

Функция printDiv () срабатывала несколько раз, но в этом случае вы теряете все элементы привязки и входные значения. Итак, мое решение - создать div для всего, что называется «body_allin», и еще один, кроме первого, под названием «body_print».

Затем вы вызываете эту функцию:

function printDiv(divName){

    var printContents = document.getElementById(divName).innerHTML;

    document.getElementById("body_print").innerHTML = printContents;

    document.getElementById("body_allin").style.display = "none";
    document.getElementById("body_print").style.display = "";

    window.print();

    document.getElementById("body_print").innerHTML = "";
    document.getElementById("body_allin").style.display = "";
    document.getElementById("body_print").style.display = "none";

}

Эта строка может быть полезна, если вам нужен уникальный идентификатор: printContents = printContents.replace (/ id = ("| ') (. *?) (" |') / G, 'id = $ 1 $ 2_2 $ 3');

pmrotule 27.02.2014 22:30

@Kevin Флорида Если у вас есть несколько div с одним и тем же классом, вы можете использовать его следующим образом:

 <div style = "display:none">
   <div id = "modal-2" class = "printableArea">
     <input type = "button" class = "printdiv-btn" value = "print a div!" />
   </div>
 </div>

я использовал внутренний тип контента Colorbox

$(document).on('click', '.printdiv-btn', function(e) {
    e.preventDefault();

    var $this = $(this);
    var originalContent = $('body').html();
    var printArea = $this.parents('.printableArea').html();

    $('body').html(printArea);
    window.print();
    $('body').html(originalContent);
});

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

Вот css, который я использовал:

@media print {
  body * {
    visibility: hidden;
  }

  #not-print * {
    display: none;
  }

  #to-print, #to-print * {
    visibility: visible;
  }

  #to-print {
    display: block !important;
    position: absolute;
    left: 0;
    top: 0;
    width: auto;
    height: 99%;
  }
}

Мой HTML:

<div id = "not-print" >
  <header class = "row wrapper page-heading">

  </header>

  <div class = "wrapper wrapper-content">
    <%= image_tag @qrcode.image_url,  size: "250x250" , alt: "#{@qrcode.name}" %>
  </div>
</div>

<div id = "to-print" style = "display: none;">
  <%= image_tag @qrcode.image_url,  size: "300x300" , alt: "#{@qrcode.name}" %>
</div>

У меня было несколько изображений, каждое с кнопкой, и мне нужно было нажать кнопку, чтобы напечатать каждый div с изображением. Это решение работает, если я отключил кеш в своем браузере, а размер изображения не меняется в Chrome:

        function printDiv(divName) {

        var printContents = document.getElementById(divName).innerHTML;
        w = window.open();

        w.document.write(printContents);
        w.document.write('<scr' + 'ipt type = "text/javascript">' + 'window.onload = function() { window.print(); window.close(); };' + '</sc' + 'ript>');

        w.document.close(); // necessary for IE >= 10
        w.focus(); // necessary for IE >= 10

        return true;
    }

<div id = "printableArea">
      <h1>Print me</h1>
</div>

<input type = "button" onclick = "printDiv('printableArea')" value = "print a div!" />

Я пробовал многие из предложенных решений, но ни одно из них не сработало идеально. Они либо теряют привязки CSS или JavaScript. Я нашел идеальное и простое решение, которое не теряет привязки CSS или JavaScript.

HTML:

<div id='printarea'>
    <p>This is a sample text for printing purpose.</p>
    <input type='button' id='btn' value='Print' onclick='printFunc();'>
</div>
<p>Do not print.</p>

Javascript:

function printFunc() {
    var divToPrint = document.getElementById('printarea');
    var htmlToPrint = '' +
        '<style type = "text/css">' +
        'table th, table td {' +
        'border:1px solid #000;' +
        'padding;0.5em;' +
        '}' +
        '</style>';
    htmlToPrint += divToPrint.outerHTML;
    newWin = window.open("");
    newWin.document.write("<h3 align='center'>Print Page</h3>");
    newWin.document.write(htmlToPrint);
    newWin.print();
    newWin.close();
    }

Это открытие и создание еще одного окна, которое не работает на Android. Работает только прямой window.print ().

Merv 14.01.2019 06:10

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

printWindow(selector, title) {
   var divContents = $(selector).html();
   var $cssLink = $('link');
   var printWindow = window.open('', '', 'height=' + window.outerHeight * 0.6 + ', width=' + window.outerWidth  * 0.6);
   printWindow.document.write('<html><head><h2><b><title>' + title + '</title></b></h2>');
   for(var i = 0; i<$cssLink.length; i++) {
    printWindow.document.write($cssLink[i].outerHTML);
   }
   printWindow.document.write('</head><body >');
   printWindow.document.write(divContents);
   printWindow.document.write('</body></html>');
   printWindow.document.close();
   printWindow.onload = function () {
            printWindow.focus();
            setTimeout( function () {
                printWindow.print();
                printWindow.close();
            }, 100);  
        }
}

Здесь предоставлено некоторое время, чтобы показать, что к нему применяются внешние CSS.

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

Arpit Shrivastava 19.06.2018 14:24

Лучший css для размещения пустого пространства по высоте:

@media print {
  body * {
    visibility: hidden;
    height:0;
  }
  #section-to-print, #section-to-print * {
    visibility: visible;
    height:auto;
  }
  #section-to-print {
    position: absolute;
    left: 0;
    top: 0;
  }
}

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

Он работает путем перебора выбранных узловых элементов и для каждого узла проходит вверх по дереву DOM до элемента BODY. На каждом уровне, включая начальный (который является уровнем узла для печати), он прикрепляет класс маркера (pe-preserve-print) к текущему узлу. Затем присоединяет другой класс маркера (pe-no-print) ко всем братьям и сестрам текущего узла, но только если на них нет класса pe-preserve-print. В качестве третьего акта он также присоединяет другой класс к сохранившимся элементам-предкам pe-preserve-ancestor.

Очень простой дополнительный CSS-код, предназначенный только для печати, будет скрывать и отображать соответствующие элементы. Некоторые преимущества этого подхода заключаются в том, что все стили сохраняются, новое окно не открывается, нет необходимости перемещать множество элементов DOM и, как правило, он не вмешивается в исходный документ.

См. демонстрация или прочтите соответствующую статью для получения дополнительной информации.

Я нашел решение.

@media print {
    .print-area {
        background-color: white;
        height: 100%;
        width: auto;
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
        z-index:1500;
        visibility: visible;
    }
    @page{
        size: portrait;
        margin: 1cm;
    }
/*IF print-area parent element is position:absolute*/
    .ui-dialog,
    .ui-dialog .ui-dialog-content{
        position:unset !important;
        visibility: hidden;
    }
}

Лучший способ распечатать конкретный Div или любой элемент

printDiv("myDiv");

function printDiv(id){
        var printContents = document.getElementById(id).innerHTML;
        var originalContents = document.body.innerHTML;
        document.body.innerHTML = printContents;
        window.print();
        document.body.innerHTML = originalContents;
}

основываясь на ответе @Kevin Florida, я сделал способ избежать отключения скрипта на текущей странице из-за перезаписи содержимого. Я использую другой файл под названием «printScreen.php» (или .html). Оберните все, что вы хотите напечатать, в div "printSource". А с помощью javascript откройте новое окно, которое вы создали ранее («printScreen.php»), затем возьмите содержимое в «printSource» верхнего окна.

Вот код.

Главное окно:

echo "<div id='printSource'>";
//everything you want to print here
echo "</div>";

//add button or link to print
echo "<button id='btnPrint'>Print</button>";

<script>
  $("#btnPrint").click(function(){
    printDiv("printSource");
  });

  function printDiv(divName) {
   var printContents = document.getElementById(divName).innerHTML;
   var originalContents = document.body.innerHTML;
   w=window.open("printScreen.php", "_blank", "toolbar=yes,scrollbars=yes,resizable=yes,top=50,left=50,width=900,height=400");
   }
</script>

Это «printScreen.php» - другой файл для захвата содержимого для печати.

<head>
// write everything about style/script here (.css, .js)

</head>
<body id='mainBody'></body>
</html>


<script>
    //get everything you want to print from top window
    src = window.opener.document.getElementById("printSource").innerHTML;

    //paste to "mainBody"
    $("#mainBody").html(src);
    window.print();
    window.close();
</script>

Без клоунады CSS лучше всего работает HTML и чистый javascript с iframe. Затем просто щелкните текст, который хотите распечатать. Текущий пример для элементов id с текстовым содержимым;

html body:

<div id = "monitor" onclick = "idElementPrint()">text i want to print</div>

чистый javascript:

//or: monitor.textContent = "click me to print textual content";

const idElementPrint = () => {
    let ifram = document.createElement("iframe");
    ifram.style = "display:none";
    document.body.appendChild(ifram);
    pri = ifram.contentWindow;
    pri.document.open();
    pri.document.write(monitor.textContent);
    pri.document.close();
    pri.focus();
    pri.print();
    }

Другие вопросы по теме