Jak mogę otworzyć okno dialogowe drukowania przy użyciu JavaScript?


159

Mam stronę z łączem „Drukuj”, które przenosi użytkownika na stronę do druku. Klient chce, aby okno dialogowe drukowania pojawiło się automatycznie, gdy użytkownik dotrze do strony, którą można wydrukować. Jak mogę to zrobić za pomocą JavaScript?

Odpowiedzi:


235
window.print();  

chyba że masz na myśli niestandardowe wyskakujące okienko.


5
Trochę stary, ale lubię dodawać ... window.print (); setTimeout ("window.close ()", 100); . To czeka wystarczająco dużo czasu na załadowanie reszty strony, ale następnie zawiesza się do naciśnięcia przycisku drukowania w oknie dialogowym drukowania lub anulowania, a następnie starannie zamyka kartę ponownie.
Stephen


21

Podoba mi się to, że możesz dodać dowolne pola i wydrukować to w ten sposób.

function printPage() {
    var w = window.open();

    var headers =  $("#headers").html();
    var field= $("#field1").html();
    var field2= $("#field2").html();

    var html = "<!DOCTYPE HTML>";
    html += '<html lang="en-us">';
    html += '<head><style></style></head>';
    html += "<body>";

    //check to see if they are null so "undefined" doesnt print on the page. <br>s optional, just to give space
    if(headers != null) html += headers + "<br/><br/>";
    if(field != null) html += field + "<br/><br/>";
    if(field2 != null) html += field2 + "<br/><br/>";

    html += "</body>";
    w.document.write(html);
    w.window.print();
    w.document.close();
};

2
To zadziałało na mnie jak urok. Potrzebne, aby zezwolić na wyskakujące okienka w przeglądarce. Nie jestem pewien, czy „zamknięcie” kiedykolwiek zostanie wykonane, ponieważ karta nigdy nie znika.
bogaty

5

Robię to, aby upewnić się, że pamiętają o drukowaniu w orientacji poziomej, co jest niezbędne w przypadku wielu stron na wielu drukarkach.

<a href="javascript:alert('Please be sure to set your printer to Landscape.');window.print();">Print Me...</a>

lub

<body onload="alert('Please be sure to set your printer to Landscape.');window.print();">
etc.
</body>

3

Jeśli masz tylko link bez modułu obsługi zdarzenia kliknięcia:

<a href="javascript:window.print();">Print Page</a>

0

Możesz przywiązać go do przycisku lub wczytywania strony.

window.print();

0

Wiem, że odpowiedź została już udzielona. Ale chciałem tylko rozwinąć kwestię robienia tego w aplikacji Blazor (maszynka do golenia) ...

Będziesz musiał wstrzyknąć IJSRuntime, aby wykonać JSInterop (uruchamianie funkcji javascript z C #)

NA TWOJEJ STRONIE RAZOR:

@inject IJSRuntime JSRuntime

Po wstrzyknięciu utwórz przycisk ze zdarzeniem click, które wywołuje metodę C #:

<MatFAB Icon="@MatIconNames.Print" OnClick="@(async () => await print())"></MatFAB>

(lub coś prostszego, jeśli nie używasz MatBlazor)

<button @onclick="@(async () => await print())">PRINT</button>

Dla metody C #:

public async Task print()
{
    await JSRuntime.InvokeVoidAsync("printDocument");
}

TERAZ W TWOIM index.html:

<script>
    function printDocument() {
        window.print();
    }
</script>

Coś, na co należy zwrócić uwagę, powodem, dla którego zdarzenia onclick są asynchroniczne, jest to, że IJSRuntime oczekuje na wywołania, takie jak InvokeVoidAsync

PS: Jeśli chcesz, aby na przykład okno komunikatu w asp net core:

await JSRuntime.InvokeAsync<string>("alert", "Hello user, this is the message box");

Aby mieć wiadomość z potwierdzeniem:

bool question = await JSRuntime.InvokeAsync<bool>("confirm", "Are you sure you want to do this?");
    if(question == true)
    {
        //user clicked yes
    }
    else
    {
        //user clicked no
    }

Mam nadzieję że to pomoże :)


-6

jeśli problem:

 mywindow.print();

alternatywnie za pomocą:

'<scr'+'ipt>print()</scr'+'ipt>'

Pełny:

 $('.print-ticket').click(function(){

        var body = $('body').html();
        var ticket_area = '<aside class="widget tickets">' + $('.widget.tickets').html() + '</aside>';

        $('body').html(ticket_area);
        var print_html = '<html lang="tr">' + $('html').html() + '<scr'+'ipt>print()</scr'+'ipt>' + '</html>'; 
        $('body').html(body);

        var mywindow = window.open('', 'my div', 'height=600,width=800');
        mywindow.document.write(print_html);
        mywindow.document.close(); // necessary for IE >= 10'</html>'
        mywindow.focus(); // necessary for IE >= 10
        //mywindow.print();
        mywindow.close();

        return true;
    });

3
dlaczego w ogóle łączysz to razem? '<scr' + 'ipt> print () </ scr' + 'ipt>'
CRice
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.