Twitter Bootstrap: Drukuj zawartość okna modalnego

Rozwijam stronę za pomocą Bootstrap, który ma 28 okien modalnych z informacjami o różnych produktach. Chcę móc wydrukować informacje w otwartym oknie modalnym. Każde okno ma id.

<!-- firecell panel & radio hub -->
           <div class="modal hide fade" id="fcpanelhub">
              <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">X</button>
                <h3>5000 Control Panel & Radio Hub</h3>
              </div>
              <div class="modal-body">
                <img src="../site/img/firecell/firecell-panel-info-1.png" alt=""/><hr/>
                <img src="../site/img/firecell/firecell-panel-info-2.png" alt=""/><hr/>
                <img src="../site/img/firecell/firecell-radio-hub-info-1.png" alt=""/><hr/>
                <img src="../site/img/firecell/firecell-radio-hub-info-2.png" alt=""/>
              </div>
              <div class="modal-footer">
                <a href="#" class="btn" data-dismiss="modal">Close</a>
              </div>    
           </div>

Więc jeśli dodam nowy przycisk w modal-footer - 'print', i zostanie kliknięty chcę, aby ten modal wydrukował. Czy mam rację mówiąc, że javascript będzie używany? Jeśli tak, jak powiedzieć javascript, aby drukował tylko otwarty modal, a nie inne?

/ Align = "left" /
Author: MattSull, 2012-08-29

9 answers

Inne rozwiązanie

Oto nowe rozwiązanie oparte na Bennett McElwee odpowiedź W to samo pytanie Jak wspomniano poniżej.

Testowane z IE 9 & 10, Opera 12.01, Google Chrome 22 i Firefox 15.0.
przykład jsFiddle

1.) Dodaj ten CSS do swojej strony:

@media screen {
  #printSection {
      display: none;
  }
}

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

2.) Add my JavaScript function

function printElement(elem, append, delimiter) {
    var domClone = elem.cloneNode(true);

    var $printSection = document.getElementById("printSection");

    if (!$printSection) {
        $printSection = document.createElement("div");
        $printSection.id = "printSection";
        document.body.appendChild($printSection);
    }

    if (append !== true) {
        $printSection.innerHTML = "";
    }

    else if (append === true) {
        if (typeof (delimiter) === "string") {
            $printSection.innerHTML += delimiter;
        }
        else if (typeof (delimiter) === "object") {
            $printSection.appendChild(delimiter);
        }
    }

    $printSection.appendChild(domClone);
}​

Jesteś gotowy do wydrukowania dowolnego elementu na swojej stronie!
Po prostu wywołaj printElement() ze swoim elementem(elementami) i wykonaj window.print() kiedy skończysz.

Uwaga: Jeśli chcesz zmodyfikować zawartość przed wydrukowaniem (i tylko w wersji drukowanej), sprawdź ten przykład (podany przez waspina w komentarzach): http://jsfiddle.net/95ezN/121/

Można również użyć CSS, aby pokazać dodatkową zawartość w wersji drukowanej (i tylko tam).


Poprzednie rozwiązanie

Myślę, że musisz ukryć wszystkie inne części strony za pomocą CSS.

To będzie najlepiej, aby przenieść całą zawartość nie dającą się wydrukować do osobnego DIV:

<body>
  <div class="non-printable">
    <!-- ... -->
  </div>

  <div class="printable">
    <!-- Modal dialog comes here -->
  </div>
</body>

A następnie w CSS:

.printable { display: none; }

@media print
{
    .non-printable { display: none; }
    .printable { display: block; }
}

Podziękowania kierujemy do Greg kto już odpowiedział na podobne pytanie: Print

only?

Istnieje jeden problem w użyciu JavaScript : użytkownik nie może zobaczyć podglądu - przynajmniej w Internet Explorerze!

 51
Author: ComFreek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 23:40:57

Sugerowałbym wypróbowanie tej wtyczki jQuery Print element

Pozwala na wydrukowanie wybranego elementu.

 8
Author: maxisam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-29 15:50:54

Przy aktualnie akceptowanym rozwiązaniu nie można już wydrukować strony zawierającej samo okno dialogowe. Oto znacznie bardziej dynamiczne rozwiązanie:

JavaScript:

$().ready(function () {
    $('.modal.printable').on('shown.bs.modal', function () {
        $('.modal-dialog', this).addClass('focused');
        $('body').addClass('modalprinter');

        if ($(this).hasClass('autoprint')) {
            window.print();
        }
    }).on('hidden.bs.modal', function () {
        $('.modal-dialog', this).removeClass('focused');
        $('body').removeClass('modalprinter');
    });
});

CSS:

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

    body.modalprinter .modal-dialog.focused {
        position: absolute;
        padding: 0;
        margin: 0;
        left: 0;
        top: 0;
    }

    body.modalprinter .modal-dialog.focused .modal-content {
        border-width: 0;
    }

    body.modalprinter .modal-dialog.focused .modal-content .modal-header .modal-title,
    body.modalprinter .modal-dialog.focused .modal-content .modal-body,
    body.modalprinter .modal-dialog.focused .modal-content .modal-body * {
        visibility: visible;
    }

    body.modalprinter .modal-dialog.focused .modal-content .modal-header,
    body.modalprinter .modal-dialog.focused .modal-content .modal-body {
        padding: 0;
    }

    body.modalprinter .modal-dialog.focused .modal-content .modal-header .modal-title {
        margin-bottom: 20px;
    }
}

Przykład:

<div class="modal fade printable autoprint">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h4 class="modal-title">Modal title</h4>
      </div>
      <div class="modal-body">
        <p>One fine body&hellip;</p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary" onclick="window.print();">Print</button>
      </div>
    </div><!-- /.modal-content -->
  </div><!-- /.modal-dialog -->
</div><!-- /.modal -->
 8
Author: dtrunk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-23 11:11:45

Oto opcja wykorzystująca rozszerzenie JQuery, które zrobiłem na podstawie kodu waspinatora w komentarzach zaakceptowanej odpowiedzi:

jQuery.fn.extend({
    printElem: function() {
        var cloned = this.clone();
        var printSection = $('#printSection');
        if (printSection.length == 0) {
            printSection = $('<div id="printSection"></div>')
            $('body').append(printSection);
        }
        printSection.append(cloned);
        var toggleBody = $('body *:visible');
        toggleBody.hide();
        $('#printSection, #printSection *').show();
        window.print();
        printSection.remove();
        toggleBody.show();
    }
});

$(document).ready(function(){
    $(document).on('click', '#btnPrint', function(){
        $('.printMe').printElem();
    });
});

JSFiddle: http://jsfiddle.net/95ezN/1227/

Może to być przydatne, jeśli nie chcesz, aby to było stosowane do każdego wydruku i po prostu zrób to na niestandardowym przycisku drukowania (co było w moim przypadku).

 5
Author: bostero2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-10 10:27:51

Jest to poprawione rozwiązanie, które będzie również działać w oknach modalnych renderowanych przy użyciu szablonu Grails, gdzie możesz mieć ten sam szablon modalny wywoływany wielokrotnie (z różnymi wartościami) w tym samym ciele. Ten wątek bardzo mi pomógł, więc pomyślałem, że podzielę się nim na wypadek, gdyby inni użytkownicy Grails znaleźli drogę tutaj.

Dla tych, którzy są ciekawi, przyjęte rozwiązanie nie zadziałało dla mnie, ponieważ renderuję tabelę; każdy wiersz ma przycisk, który otwiera okno modalne z większą ilością szczegółów o płycie. Doprowadziło to do stworzenia i wydrukowania na sobie wielu div-ów printSection. Dlatego musiałem zmienić js, aby wyczyścić div po zakończeniu drukowania.

CSS

Dodałem ten CSS bezpośrednio do mojego modalnego gsp, ale dodanie go do rodzica ma ten sam efekt.

<style type="text/css">
   @media screen {
        #printSection {
           display: none;
        }
   }

   @media print {
        body > *:not(#printSection) {
           display: none;
        }
        #printSection, #printSection * {
            visibility: visible;
        }
        #printSection {
            position:absolute;
            left:0;
            top:0;
        }
   }
</style>

Dodanie go do CSS w całej witrynie zabiło funkcjonalność drukowania w innych częściach witryny. Mam to z ComFreak's accepted answer (based on Bennett Odpowiedź McElwee ), ale jest poprawiona przy użyciu funkcji": not " z odpowiedzi fanfavorite na Print

only? . Zdecydowałem się na "wyświetlanie" zamiast "widoczność", ponieważ moje niewidoczne treści ciała tworzyły dodatkowe puste strony, co było nie do przyjęcia dla moich użytkowników.

Js

I to do mojego javascript, poprawione z ComFreak's zaakceptowanej odpowiedzi na to pytanie.

function printDiv(div) {    
    // Create and insert new print section
    var elem = document.getElementById(div);
    var domClone = elem.cloneNode(true);
    var $printSection = document.createElement("div");
    $printSection.id = "printSection";
    $printSection.appendChild(domClone);
    document.body.insertBefore($printSection, document.body.firstChild);

    window.print(); 

    // Clean up print section for future use
    var oldElem = document.getElementById("printSection");
    if (oldElem != null) { oldElem.parentNode.removeChild(oldElem); } 
                          //oldElem.remove() not supported by IE

    return true;
}

Nie miałem potrzeby dodawania elementów, więc usunięto ten aspekt i zmieniono funkcję, aby konkretnie wydrukować div.

HTML (gsp)

I szablon modalny. Wyświetla nagłówek modalny i treść oraz wyłącza stopkę, w której znajdowały się przyciski.

<div class="modal-content">
    <div id="print-me"> <!-- This is the div that is cloned and printed -->
        <div class="modal-header">
            <!-- HEADER CONTENT -->
        </div>
        <div class="modal-body">
             <!-- BODY CONTENT -->
        </div>
    </div>
    <div class="modal-footer">
                                 <!-- This is where I specify the div to print -->
        <button type="button" class="btn btn-default" onclick="printDiv('print-me')">Print</button>
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
    </div>
</div>
Mam nadzieję, że to komuś pomoże!
 3
Author: Kara Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:56

Używam tylko trochę jQuery / javascript:

Html:

<h1>Don't Print</h1>

<a data-target="#myModal" role="button" class="btn" data-toggle="modal">Launch modal</a>

<div class="modal fade hide" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"      aria-hidden="true">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
     <h3 id="myModalLabel">Modal to print</h3>
  </div>
  <div class="modal-body">
    <p>Print Me</p>
  </div>
  <div class="modal-footer">
    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
    <button class="btn btn-primary" id="printButton">Print</button>
  </div>
</div>

Js:

$('#printButton').on('click', function () {
if ($('.modal').is(':visible')) {
    var modalId = $(event.target).closest('.modal').attr('id');
    $('body').css('visibility', 'hidden');
    $("#" + modalId).css('visibility', 'visible');
    $('#' + modalId).removeClass('modal');
    window.print();
    $('body').css('visibility', 'visible');
    $('#' + modalId).addClass('modal');
} else {
    window.print();
}

});

Oto skrzypce

 1
Author: alexoviedo999,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-04 20:15:24

Oto rozwiązanie bez Javascript lub plugin-tylko trochę css i jedną dodatkową klasę w znacznikach. Rozwiązanie to wykorzystuje fakt, że BootStrap dodaje klasę do ciała, gdy otwarte jest okno dialogowe. Używamy tej klasy, aby ukryć treść i wydrukować tylko okno dialogowe.

Aby upewnić się, że możemy określić główną treść strony, musimy zawierać wszystko w treści strony głównej w div-użyłem id= "mainContent". Przykładowy układ strony poniżej-ze stroną główną i dwoma dialogi

<body>
 <div class="container body-content">

  <div id="mainContent">
       main page stuff     
  </div>
  <!-- Dialog One -->
  <div class="modal fade in">
   <div class="modal-dialog">
    <div class="modal-content">
          ...
    </div>
   </div>
  </div>

  <!-- Dialog Two -->
  <div class="modal fade in">
   <div class="modal-dialog">
    <div class="modal-content">
          ...
    </div>
   </div>
  </div>

 </div>
</body>

Następnie w naszych zapytaniach CSS print media, używam display: none, aby ukryć wszystko, czego nie chcę wyświetlać - czyli mainContent, gdy otwarte jest okno dialogowe. Używam również specyficznej klasy noPrint, która ma być używana na wszystkich częściach strony, które nie powinny być wyświetlane-powiedzmy przyciski akcji. Tutaj ukrywam również nagłówki i stopki. Być może trzeba go dostosować, aby uzyskać dokładnie chcesz chcesz.

@media print {
    header, .footer, footer {
        display: none;
    }

    /* hide main content when dialog open */
    body.modal-open div.container.body-content div#mainContent {
        display: none;
    }

    .noPrint {
        display: none;
    }
}
 0
Author: Peter Kerr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-01 14:20:58

Miałem do czynienia z dwoma problemami Problem 1: wszystkie pola przychodziły jedno po drugim i Wydanie 2 Biała spacja u dołu strony podczas drukowania z wyskakującego okienka.

Rozwiązałem to przez

Making display none to all body * elements most of them go to visibility hidden which creates space so avoid visibility hidden

    @media print {
        body * {
           display:none;
        width:auto;
        height:auto;
        margin:0px;padding:0px; 
        }
        #printSection, #printSection * {
            display:inline-block!important;
        }
        #printSection {
            position:absolute;
            left:0;
            top:0;  
            margin:0px; 
            page-break-before: none;
            page-break-after: none;
            page-break-inside: avoid;      
        }
#printSection .form-group{

      width:100%!important;
      float:left!important;
      page-break-after: avoid;
    }
#printSection label{
        float:left!important;
        width:200px!important;
        display:inline-block!important;
      }

#printSection .form-control.search-input{
        float:left!important;
        width:200px!important;
        display: inline-block!important;
      }
}
 0
Author: Nadeemmnn Mohd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-07 09:45:08

@media print{
	body{
		visibility: hidden; /* no print*/
	}
	.print{
		
		visibility:visible; /*print*/
	}
}
<body>
  <div class="noprint"> <!---no print--->
  <div class="noprint"> <!---no print--->
  <div class="print">   <!---print--->
  <div class="print">   <!---print--->


</body>
 -1
Author: Amin Emadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-21 15:41:20