ปิดหน้าต่างโดยอัตโนมัติหลังจากปิดกล่องโต้ตอบการพิมพ์


89

ฉันเปิดแท็บเมื่อผู้ใช้คลิกปุ่ม เมื่อonloadฉันเปิดกล่องโต้ตอบการพิมพ์ขึ้นมา แต่ผู้ใช้ถามฉันว่าเป็นไปได้หรือไม่ที่หลังจากส่งไปยังเครื่องพิมพ์เพื่อพิมพ์แล้วแท็บสามารถปิดตัวเองได้ ฉันไม่แน่ใจว่าจะทำได้ไหม ฉันได้ลองใช้setTimeout();แล้ว แต่ไม่ใช่ช่วงเวลาที่กำหนดเนื่องจากผู้ใช้อาจเสียสมาธิและต้องเปิดแท็บใหม่ มีวิธีใดบ้างที่จะทำสิ่งนี้ให้สำเร็จ?


ดูคำตอบนี้
Kirk Strobeck

คำตอบ:


117

หากคุณพยายามปิดหน้าต่างหลังการเรียก print () มันอาจปิดหน้าต่างทันทีและ print () จะไม่ทำงาน นี่คือสิ่งที่คุณไม่ควรทำ :

window.open();
...
window.print();
window.close();

โซลูชันนี้จะใช้งานได้ใน Firefox เนื่องจากในการเรียก print () จะรอจนกว่าการพิมพ์จะเสร็จสิ้นจากนั้นจะประมวลผล javascript ต่อไปและปิด () หน้าต่าง IE จะล้มเหลวเนื่องจากเรียกใช้ฟังก์ชัน close () โดยไม่รอให้การเรียก print () เสร็จสิ้น หน้าต่างป๊อปอัพจะปิดก่อนการพิมพ์จะเสร็จสิ้น

วิธีหนึ่งในการแก้ปัญหาคือใช้เหตุการณ์ "onafterprint" แต่ฉันไม่แนะนำให้คุณใช้เพราะเหตุการณ์เหล่านี้ใช้ได้เฉพาะใน IE

วิธีที่ดีที่สุดคือปิดหน้าต่างป๊อปอัปเมื่อปิดกล่องโต้ตอบการพิมพ์ (พิมพ์เสร็จหรือยกเลิก) ในขณะนี้หน้าต่างป๊อปอัปจะถูกโฟกัสและคุณสามารถใช้เหตุการณ์ "ออนโฟกัส" เพื่อปิดป๊อปอัปได้

ในการดำเนินการนี้เพียงแค่ใส่โค้ดที่ฝังจาวาสคริปต์นี้ในหน้าต่างป๊อปอัปของคุณ:

<script type="text/javascript">
window.print();
window.onfocus=function(){ window.close();}
</script>

หวังว่าสิ่งนี้จะเป็นไปได้ ;-)

อัปเดต:

สำหรับ Chrome เบราว์เซอร์ใหม่มันอาจจะยังคงใกล้เคียงเร็วเกินไปดูที่นี่ ฉันได้ดำเนินการเปลี่ยนแปลงนี้แล้วและใช้ได้กับเบราว์เซอร์ปัจจุบันทั้งหมด: 2/29/16

        setTimeout(function () { window.print(); }, 500);
        window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }

สำหรับสิ่งที่คุ้มค่าสิ่งนี้ดูเหมือนจะล้มเหลวใน IE8 หน้าต่างจะปิดลงทันทีก่อนที่กล่องโต้ตอบการพิมพ์จะปรากฏขึ้น
Heath

15
สิ่งนี้ดูเหมือนจะใช้ไม่ได้กับ chrome ในตอนนี้เนื่องจาก chrome จัดการการพิมพ์ภายในหน้าต่างจะไม่สูญเสียโฟกัสเมื่อกล่องโต้ตอบการพิมพ์โหลดขึ้นดังนั้นจึงไม่ได้รับการโฟกัสอีกครั้งเมื่อพิมพ์เสร็จ วิธีใดที่จะทำให้ Chrome ใช้งานได้
jlbriggs

6
เมื่อวันที่กุมภาพันธ์ 2016 คำตอบที่อิงจาก focus () อื่น ๆ ไม่ทำงานใน Chrome อีกต่อไป ทางออกเดียวที่ใช้งานได้คือ @noamtcohen (น่าเศร้าที่มีจำนวนโหวตต่ำมาก)
Jpsy

2
ฉันคิดว่า Chrome เวอร์ชันล่าสุดไม่แสดงกล่องโต้ตอบการพิมพ์จนกว่ารูปภาพในหน้าจะโหลดขึ้น แต่มันกำลังดำเนินการปิดก่อนหน้านี้จึงปิดก่อนที่จะโหลด (กล่องโต้ตอบการพิมพ์ไม่เคยแสดง) เพื่อแก้ไขwindow.onload = function () { window.print(); setTimeout(window.close, 500); };
Brian Leishman

5
วิธีแก้ปัญหาข้างต้นไม่ได้ผลอีกต่อไปโปรดเพิ่ม event listener onafterprintเพื่อปิด window.onafterprint = function () {window.close ()};
Rahat Hameed

91

นี่คือสิ่งที่ฉันคิดขึ้นฉันไม่รู้ว่าทำไมมีความล่าช้าเล็กน้อยก่อนที่จะปิด

 window.print();
 setTimeout(window.close, 0);

1
เป็นที่น่าสนใจว่าคำตอบที่มีคะแนนต่ำนี้เป็นคำตอบที่ถูกต้อง ณ เดือนกุมภาพันธ์ 2016 ไม่มีคำตอบจากโฟกัส () ข้อใดใช้งานได้ใน Chrome อีกต่อไป โซลูชันนี้ใช้ได้กับ FF, Chrome และ Safari บน Windows และ OS X, IE9 +, Android Chrome และ IOS Safari เราพบเฉพาะข้อความยืนยันใน IE รุ่นเก่าเท่านั้น อื่น ๆ ทั้งหมดปิดอย่างราบรื่น
Jpsy

6
ณ วันที่ 17 มีนาคมสิ่งนี้ไม่ได้ผลสำหรับฉันเหมือนกับใน Chrome (56) แต่เพิ่มเวลาในการหมดเวลา window.print (); setTimeout (window.close, 500);
jAC

ดังที่กล่าวถึง jAC สิ่งนี้ต้องใช้เวลามากขึ้นในการทำงาน ในของฉัน 10ms นั้นไม่เพียงพอ แต่ 100 คือ ดูเหมือนว่าจะใช้เวลานานแค่ไหนในการแสดงตัวอย่างก่อนพิมพ์ ด้วยการตั้งค่าของฉันเป็น 10 มิลลิวินาทีมันจะพิมพ์เวอร์ชันที่แสดงผลเพียงบางส่วนของเพจเท่านั้น ด้วย 100 ฉันได้ทุกอย่าง
Jacob Ewing

1
หากต้องการขยายนั้นดูเหมือนว่า ~ หมดเวลาจะหยุดชั่วคราวเมื่อหน้าต่างการพิมพ์แสดงผลอย่างสมบูรณ์ (ใน chrome บน macbook อยู่ดี) และส่วนที่เหลือจะถูกนับหลังจากปิดหน้าต่าง
Jacob Ewing

1
คุณไม่ต้องการ 0 มันเป็นค่าเริ่มต้น
Brian Leishman

14

แค่:

window.print();
window.close();

มันได้ผล.


2
สิ่งนี้ใช้งานไม่ได้สำหรับฉันใน Chrome บางครั้งก็ใช้งานได้ แต่บางครั้งหน้าต่างก็ปิดลงทันทีก่อนที่กล่องโต้ตอบการพิมพ์จะปรากฏขึ้น ฉันสามารถป้องกันไม่ให้เกิดขึ้นได้โดยการเพิ่มระยะหมดเวลาเป็น 5,000 แต่บางครั้งอาจใช้เวลาถึง 5 วินาทีในการปิดหน้าต่างหลังจากพิมพ์ ฉันไม่แน่ใจว่าเกิดอะไรขึ้นที่นี่ แต่ดูเหมือนว่าจะไม่ค่อยมีประสิทธิภาพในเบราว์เซอร์ต่างๆ
speedarius

1
ดังที่กล่าวไว้ด้านล่างโซลูชันข้ามเบราว์เซอร์เต็มรูปแบบมีความซับซ้อนมากขึ้น
Eric

1
อย่าลืม: Scripts may close only the windows that were opened by it.คำเตือน
Cas Bloem

วิธีแก้ปัญหาข้างต้นไม่ได้ผลอีกต่อไปโปรดเพิ่ม event listener onafterprintเพื่อปิดหน้าต่าง window.onafterprint = function(){ window.close()};
Rahat Hameed

13

ฉันแค่อยากจะเขียนสิ่งที่ฉันได้ทำและสิ่งที่ได้ผลสำหรับฉัน (เพราะฉันพยายามไม่ได้ผล)

ฉันมีปัญหาว่า IE จะปิดหน้าต่างก่อนที่กล่องโต้ตอบการพิมพ์จะเปิดขึ้น

หลังจากการทดสอบลองผิดลองถูกมากมายนี่คือสิ่งที่ฉันต้องทำ:

var w = window.open();
w.document.write($('#data').html()); //only part of the page to print, using jquery
w.document.close(); //this seems to be the thing doing the trick
w.focus();
w.print();
w.close();

ดูเหมือนว่าจะใช้ได้กับทุกเบราว์เซอร์


ดูเหมือนจะทำงาน ไม่ทำอีกต่อไปฉันจะโพสต์รหัสของฉันด้านล่าง
Remco

10

รหัสนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน:

<body onload="window.print()" onfocus="window.close()">

เมื่อหน้าเปิดขึ้นจะเปิดกล่องโต้ตอบการพิมพ์โดยอัตโนมัติและหลังจากพิมพ์หรือยกเลิกจะปิดหน้าต่าง

หวังว่ามันจะช่วย


ปริมาณนี้ใช้ไม่ได้ถ้าคุณเปิด pdf เพื่อพิมพ์ไม่ใช่ html หรือ jsp แล้วฉันจะใส่ onload body ได้ที่ไหน?
แชร์

9

แน่ใจว่าสิ่งนี้แก้ไขได้อย่างง่ายดายโดยทำสิ่งนี้:

      <script type="text/javascript">
         window.print();
         window.onafterprint = window.close();
      </script>

หรือถ้าคุณต้องการทำสิ่งที่ต้องการเช่นไปที่หน้าก่อนหน้า

    <script type="text/javascript">
        window.print();
        window.onafterprint = back;

        function back() {
            window.history.back();
        }
    </script>

window.close ();
มุสตาฟา

หมายเหตุ: window.onafterprint = window.close();ควรจะเป็นwindow.onafterprint = window.close;อดีตกำหนดผลของการwindow.close() onafterprintสิ่งนี้จะทำให้window.close()รันทันทีเมื่อตั้งค่าตัวจัดการและไม่มีอะไรให้ทำงานเมื่อonafterprintเหตุการณ์ถูกยกขึ้น หลังกำหนดให้window.closeเป็นตัวจัดการเหตุการณ์ซึ่งเป็นสิ่งที่เราต้องการ
Kei

นอกจากนี้ในบางเบราว์เซอร์การเรียกใช้โค้ดจะหยุดชั่วคราวหลังจากนั้นwindow.print();จนกว่ากล่องโต้ตอบการพิมพ์จะถูกปิด เมื่อเกิดเหตุการณ์นี้เป็นไปได้ที่onafterprintเหตุการณ์จะถูกยกขึ้นก่อนที่onafterprintจะได้รับมอบหมาย ดังนั้นมันจะดีกว่าสำหรับการที่จะมาก่อนwindow.onafterprint = window.close; window.print();มิฉะนั้นแนวทางที่ใช้ในคำตอบนี้จะทำงานได้ดีกว่าแนวทางที่ใช้โฟกัสแบบออนโฟกัสหรือ setTimeout ที่คำตอบอื่น ๆ แนะนำ
Kei

8

นี่เป็นโซลูชันข้ามเบราว์เซอร์ที่ทดสอบแล้วบน Chrome, Firefox, Opera ภายในวันที่ 2016/05

โปรดทราบว่าMicrosoft Edge มีข้อบกพร่องที่จะไม่ปิดหน้าต่างหากการพิมพ์ถูกยกเลิก ลิงค์ที่เกี่ยวข้อง

var url = 'http://...';
var printWindow = window.open(url, '_blank');
printWindow.onload = function() {
    var isIE = /(MSIE|Trident\/|Edge\/)/i.test(navigator.userAgent);
    if (isIE) {

        printWindow.print();
        setTimeout(function () { printWindow.close(); }, 100);

    } else {

        setTimeout(function () {
            printWindow.print();
            var ival = setInterval(function() {
                printWindow.close();
                clearInterval(ival);
            }, 200);
        }, 500);
    }
}

7

การใช้ Chrome ฉันพยายามอยู่พักหนึ่งเพื่อให้window.onfocus=function() { window.close(); }การ <body ... onfocus="window.close()"> ทำงาน ผลลัพธ์ของฉัน:

  1. ฉันปิดบทสนทนาการพิมพ์แล้วไม่มีอะไรเกิดขึ้น
  2. ฉันเปลี่ยนหน้าต่าง / แท็บในเบราว์เซอร์ แต่ก็ยังไม่มีอะไร
  3. เปลี่ยนกลับไปที่หน้าต่าง / แท็บแรกของฉันจากนั้นเหตุการณ์ window.onfocus ยิงปิดหน้าต่าง

ฉันยังลอง<body onload="window.print(); window.close()" >ซึ่งส่งผลให้หน้าต่างปิดก่อนที่ฉันจะคลิกอะไรก็ได้ในกล่องโต้ตอบการพิมพ์

ฉันไม่สามารถใช้อย่างใดอย่างหนึ่ง ดังนั้นฉันจึงใช้ Jquery เล็กน้อยเพื่อตรวจสอบสถานะเอกสารและรหัสนี้ใช้ได้กับฉัน

<script type="text/javascript">
    var document_focus = false; // var we use to monitor document focused status.
    // Now our event handlers.
    $(document).focus(function() { document_focus = true; });
    $(document).ready(function() { window.print(); });
    setInterval(function() { if (document_focus === true) { window.close(); }  }, 500);
</script>

ตรวจสอบให้แน่ใจว่าคุณได้รวม jquery แล้วจากนั้นคัดลอก / วางลงใน html ที่คุณกำลังพิมพ์ หากผู้ใช้พิมพ์บันทึกเป็น PDF หรือยกเลิกงานพิมพ์หน้าต่าง / แท็บจะทำลายตัวเองโดยอัตโนมัติ หมายเหตุ: ฉันได้ทดสอบสิ่งนี้ใน Chrome เท่านั้น

แก้ไข

ตามที่ Jypsy ชี้ให้เห็นในความคิดเห็นไม่จำเป็นต้องมีสถานะโฟกัสเอกสาร คุณสามารถใช้คำตอบจาก noamtcohen ฉันเปลี่ยนรหัสเป็นรหัสนั้นและใช้งานได้


วิธีนี้จะทำให้หน้าต่างเดิมค้างหากผู้ใช้ปิดป๊อปอัปโดยมีเครื่องหมาย "X" อยู่ที่มุมแทนที่จะเลือกยกเลิกหรือพิมพ์ ปัญหาเดียวกับวิธีแก้ปัญหาของ Juan ซึ่ง @JFK ชี้ให้เห็นในตอนแรก
Clayton

javascript ข้างต้นหมายความว่าจะไม่ถูกวางไว้ใน html ที่กำลังพิมพ์ไม่ว่าจะเปิดในป๊อปอัปหรืออย่างที่ฉันทำในแท็บใหม่ ดังนั้นจาวาสคริปต์นี้จึงไม่มีผลกับหน้าต่างเดิม
Nado11


5

สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน:

function print_link(link) {
    var mywindow = window.open(link, 'title', 'height=500,width=500');   
    mywindow.onload = function() { mywindow.print(); mywindow.close(); }
}



4

ฉันลองหลายอย่างแล้วไม่ได้ผล สิ่งเดียวที่เหมาะกับฉันคือ:

window.print();
window.onafterprint = function () {
    window.close();
}

ทดสอบกับโครเมี่ยม


3

โซลูชันต่อไปนี้ใช้ได้กับ IE9, IE8, Chrome และ FF เวอร์ชันที่ใหม่กว่าในปี 2014-03-10 สถานการณ์เป็นเช่นนี้: คุณอยู่ในหน้าต่าง (A) ที่คุณคลิกปุ่ม / ลิงค์เพื่อเริ่มกระบวนการพิมพ์จากนั้นหน้าต่างใหม่ (B) ที่มีเนื้อหาที่จะพิมพ์จะเปิดขึ้นกล่องโต้ตอบการพิมพ์จะแสดงทันที และคุณสามารถยกเลิกหรือพิมพ์ได้จากนั้นหน้าต่างใหม่ (B) จะปิดโดยอัตโนมัติ

รหัสต่อไปนี้ช่วยให้สามารถทำได้ รหัสจาวาสคริปต์นี้จะถูกวางไว้ใน html สำหรับหน้าต่าง A (ไม่ใช่สำหรับหน้าต่าง B):

/**
 * Opens a new window for the given URL, to print its contents. Then closes the window.
 */
function openPrintWindow(url, name, specs) {
  var printWindow = window.open(url, name, specs);
    var printAndClose = function() {
        if (printWindow.document.readyState == 'complete') {
            clearInterval(sched);
            printWindow.print();
            printWindow.close();
        }
    }
    var sched = setInterval(printAndClose, 200);
};

ปุ่ม / ลิงค์เพื่อเริ่มกระบวนการมีเพียงแค่เรียกใช้ฟังก์ชันนี้ดังใน:

openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');

ใช้งานได้ใน Chrome ตราบเท่าที่ผู้ใช้พิมพ์หรือยกเลิกการทำงาน แต่ถ้าผู้ใช้ปิดหน้าต่าง (B) หน้าต่าง (A) จะค้าง (ฉันพูดใน Chrome หรือไม่) ทดสอบ (ใน Chrome) jsfiddle.net/qy6QV/2/showและปิดหน้าต่าง แล้วลองโหลดใหม่ ...
JFK

2
<!doctype html>
<html>
<script>
 window.print();
 </script>
<?php   
date_default_timezone_set('Asia/Kolkata');
include 'db.php'; 
$tot=0; 
$id=$_GET['id'];
    $sqlinv="SELECT * FROM `sellform` WHERE `id`='$id' ";
    $resinv=mysqli_query($conn,$sqlinv);
    $rowinv=mysqli_fetch_array($resinv);
?>
        <table width="100%">
           <tr>
                <td style='text-align:center;font-sie:1px'>Veg/NonVeg</td>  
            </tr>
            <tr>
                <th style='text-align:center;font-sie:4px'><b>HARYALI<b></th>  
            </tr>   
            <tr>
                <td style='text-align:center;font-sie:1px'>Ac/NonAC</td>  
            </tr>
            <tr>
                <td style='text-align:center;font-sie:1px'>B S Yedurappa Marg,Near Junne Belgaon Naka,P B Road,Belgaum - 590003</td>  
            </tr>
        </table>
        <br>    
        <table width="100%">
           <tr>
                <td style='text-align:center;font-sie:1'>-----------------------------------------------</td>  
            </tr>
        </table>

        <table  width="100%" cellspacing='6' cellpadding='0'>

            <tr>
                <th style='text-align:center;font-sie:1px'>ITEM</th>
                <th style='text-align:center;font-sie:1px'>QTY</th>
                <th style='text-align:center;font-sie:1px'>RATE</th>
                <th style='text-align:center;font-sie:1px'>PRICE</th>
                <th style='text-align:center;font-sie:1px' >TOTAL</th>
            </tr>

            <?php
            $sqlitems="SELECT * FROM `sellitems` WHERE `invoice`='$rowinv[0]'";
            $resitems=mysqli_query($conn,$sqlitems);
            while($rowitems=mysqli_fetch_array($resitems)){
            $sqlitems1="SELECT iname FROM `itemmaster` where icode='$rowitems[2]'";
            $resitems1=mysqli_query($conn,$sqlitems1);
            $rowitems1=mysqli_fetch_array($resitems1);
            echo "<tr>
                <td style='text-align:center;font-sie:3px'  >$rowitems1[0]</td>
                <td style='text-align:center;font-sie:3px' >$rowitems[5]</td>
                <td style='text-align:center;font-sie:3px' >".number_format($rowitems[4],2)."</td>
                <td style='text-align:center;font-sie:3px' >".number_format($rowitems[6],2)."</td>
                <td style='text-align:center;font-sie:3px' >".number_format($rowitems[7],2)."</td>
              </tr>";
                $tot=$tot+$rowitems[7];
            }

            echo "<tr>
                <th style='text-align:right;font-sie:1px' colspan='4'>GRAND TOTAL</th>
                <th style='text-align:center;font-sie:1px' >".number_format($tot,2)."</th>
                </tr>";
            ?>
        </table>
     <table width="100%">
           <tr>
                <td style='text-align:center;font-sie:1px'>-----------------------------------------------</td>  
            </tr>
        </table>
        <br>
        <table width="100%">
            <tr>
                <th style='text-align:center;font-sie:1px'>Thank you Visit Again</th>  
            </tr>
        </table>
<script>
window.close();
</script>
</html>

พิมพ์และปิดหน้าต่างแท็บใหม่ด้วย php และ javascript ด้วยการคลิกปุ่มเดียว



1

วิธีนี้ได้ผลดีที่สุดสำหรับฉันในการฉีด HTML ลงในป๊อปอัปเช่น<body onload="window.print()"... ข้างต้นใช้ได้กับ IE, Chrome และ FF (บน Mac) แต่ไม่มี FF บน Windows

https://stackoverflow.com/a/11782214/1322092

var html = '<html><head><title></title>'+
               '<link rel="stylesheet" href="css/mycss.css" type="text/css" />'+
               '</head><body onload="window.focus(); window.print(); window.close()">'+
               data+
               '</body></html>';

1

นี่คือสิ่งที่ฉันทำ ....

เปิดใช้งานหน้าต่างเพื่อพิมพ์และปิดตัวเองตามพารามิเตอร์การค้นหา

ต้องใช้ jQuery สามารถทำได้ใน _Layout หรือหน้าต้นแบบเพื่อทำงานกับทุกเพจ

แนวคิดคือการส่งพารามิเตอร์ใน URL เพื่อบอกให้หน้าพิมพ์และปิดหากตั้งค่าพารามิเตอร์ไว้แล้วเหตุการณ์ jQuery“ พร้อม” จะพิมพ์หน้าต่างจากนั้นเมื่อโหลดเพจจนเต็ม (หลังจากพิมพ์)“ onload” เรียกว่าซึ่งปิดหน้าต่าง ขั้นตอนพิเศษทั้งหมดนี้คือการรอให้หน้าต่างพิมพ์ก่อนปิดตัวเอง

ในเหตุการณ์ html body add และ onload ที่เรียก printAndCloseOnLoad () ในตัวอย่างนี้เราใช้ cshtm คุณสามารถใช้ javascript เพื่อรับพารามิเตอร์

<body onload="sccPrintAndCloseOnLoad('@Request.QueryString["PrintAndClose"]');">

ในจาวาสคริปต์ให้เพิ่มฟังก์ชัน

function printAndCloseOnLoad(printAndClose) {
    if (printAndClose) {
        // close self without prompting
        window.open('', '_self', ''); window.close();
    }
}

และ jQuery พร้อมเหตุการณ์

$(document).ready(function () {
    if (window.location.search.indexOf("PrintAndClose=") > 0)
        print();
});

ตอนนี้เมื่อเปิด URL ใด ๆ เพียงแค่ต่อท้ายสตริงการสืบค้น "PrintAndClose = true" จากนั้นมันจะพิมพ์และปิด


1

สำหรับฉันแล้วทางออกสุดท้ายของฉันคือการผสมผสานของคำตอบต่างๆ:

    var newWindow = window.open();
    newWindow.document.open();
    newWindow.document.write('<html><link rel="stylesheet" href="css/normalize-3.0.2.css" type="text/css" />'
            + '<link rel="stylesheet" href="css/default.css" type="text/css" />'
            + '<link rel="stylesheet" media="print" href="css/print.css" type="text/css" />');

    newWindow.document.write('<body onload="window.print();" onfocus="window.setTimeout(function() { window.close(); }, 100);">');
    newWindow.document.write(document.getElementById(<ID>).innerHTML);
    newWindow.document.write('</body></html>');
    newWindow.document.close();
    newWindow.focus();

1

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน (2018/02) ฉันต้องการคำขอแยกต่างหากเนื่องจากงานพิมพ์ของฉันยังไม่ปรากฏบนหน้าจอ จากคำตอบที่ยอดเยี่ยมข้างต้นซึ่งฉันขอขอบคุณทุกคนฉันสังเกตเห็น:

  • w.onloadจะต้องไม่w.document.write(data)ได้รับการตั้งค่าก่อน
    มันดูแปลก ๆ เพราะคุณอยากจะวางเบ็ดไว้ก่อน ฉันเดา: เบ็ดถูกยิงไปแล้วเมื่อเปิดหน้าต่างที่ไม่มีเนื้อหา เมื่อยิงแล้วจะไม่ยิงอีก แต่เมื่อยังคงมีการประมวลผลที่เกิดขึ้นกับตัวใหม่document.write()hook จะถูกเรียกเมื่อการประมวลผลเสร็จ
  • w.document.close()ยังคงเป็นสิ่งจำเป็น มิฉะนั้นจะไม่มีอะไรเกิดขึ้น

ฉันได้ทดสอบสิ่งนี้ใน Chrome 64.0, IE11 (11.248), Edge 41.16299 (edgeHTML 16.16299), FF 58.0.1 พวกเขาจะบ่นเกี่ยวกับป๊อปอัป แต่มันพิมพ์ออกมา

function on_request_print() {
  $.get('/some/page.html')
    .done(function(data) {
      console.log('data ready ' + data.length);
      var w = window.open();
      w.document.write(data);
      w.onload = function() {
        console.log('on.load fired')
        w.focus();
        w.print();
        w.close();
      }
      console.log('written data')
      //this seems to be the thing doing the trick
      w.document.close();
      console.log('document closed')
    })
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
<a onclick="on_request_print();">Print rapportage</a>

1
const printHtml = async (html) => {
    const printable = window.open('', '_blank', 'fullscreen=no');
    printable.document.open();
    printable.document.write(`<html><body onload="window.print()">${html}</body></html>`);
    await printable.print();
    printable.close();
};

นี่คือโซลูชัน ES2016 ของฉัน


1
สวัสดี Stuart และยินดีต้อนรับสู่ Stack Overflow! คุณช่วยอธิบายได้ไหมว่าทำไมโค้ดนี้ถึงช่วย OP และผู้ใช้คนอื่น ๆ ได้มากขึ้น ขอบคุณ!
เฮเทอร์

1

สิ่งนี้ใช้ได้กับฉันอย่างสมบูรณ์แบบ @holger อย่างไรก็ตามฉันได้แก้ไขและเหมาะกับฉันมากขึ้นตอนนี้หน้าต่างปรากฏขึ้นและปิดทันทีที่คุณกดปุ่มพิมพ์หรือยกเลิก

function printcontent()
{ 
var disp_setting="toolbar=yes,location=no,directories=yes,menubar=yes,"; 
disp_setting+="scrollbars=yes,width=300, height=350, left=50, top=25"; 
var content_vlue = document.getElementById("content").innerHTML; 
var w = window.open("","", disp_setting);
w.document.write(content_vlue); //only part of the page to print, using jquery
w.document.close(); //this seems to be the thing doing the trick
w.focus();
w.print();
w.close();
}"


0

IE มี (มี?) onbeforeprintและonafterprintเหตุการณ์: คุณสามารถรอได้ แต่จะใช้ได้เฉพาะกับ IE (ซึ่งอาจจะใช่หรือไม่ก็ได้)

หรือคุณอาจลองรอให้โฟกัสกลับไปที่หน้าต่างจากกล่องโต้ตอบการพิมพ์แล้วปิด Amazon Web Services ทำสิ่งนี้ในกล่องโต้ตอบการพิมพ์ใบแจ้งหนี้: คุณกดปุ่มพิมพ์จากนั้นจะเปิดมุมมองที่พิมพ์ง่ายและเปิดกล่องโต้ตอบเครื่องพิมพ์ทันที หากคุณกดพิมพ์หรือยกเลิกกล่องโต้ตอบการพิมพ์จะปิดจากนั้นมุมมองแบบพิมพ์ง่ายจะปิดลงทันที


0

มีความเจ็บปวดมากมายที่ทำให้สิ่งต่างๆเช่นนี้ทำงานบนเบราว์เซอร์

เดิมทีฉันต้องการทำสิ่งเดียวกัน - เปิดหน้าใหม่ที่มีสไตล์สำหรับการพิมพ์พิมพ์โดยใช้ JS จากนั้นปิดอีกครั้ง นี่เป็นฝันร้าย

ในท้ายที่สุดฉันเลือกที่จะคลิกผ่านไปยังหน้าที่พิมพ์ได้จากนั้นใช้ JS ด้านล่างเพื่อเริ่มการพิมพ์จากนั้นเปลี่ยนเส้นทางตัวเองไปยังที่ที่ฉันต้องการจะไปเมื่อเสร็จสิ้น (ด้วยการตั้งค่าตัวแปรใน PHP ในกรณีนี้)

ฉันได้ทดสอบสิ่งนี้ใน Chrome และ Firefox บน OSX และ Windows และ IE11-8 แล้วและใช้ได้กับทุกคน (แม้ว่า IE8 จะหยุดทำงานเล็กน้อยหากคุณไม่ได้ติดตั้งเครื่องพิมพ์ไว้)

ล่าสุข (พิมพ์).

<script type="text/javascript">

   window.print(); //this triggers the print

   setTimeout("closePrintView()", 3000); //delay required for IE to realise what's going on

   window.onafterprint = closePrintView(); //this is the thing that makes it work i

   function closePrintView() { //this function simply runs something you want it to do

      document.location.href = "'.$referralurl.'"; //in this instance, I'm doing a re-direct

   }

</script>

0

เพียงแค่ใช้สคริปต์ java นี้

 function PrintDiv() {
    var divContents = document.getElementById("ReportDiv").innerHTML;
    var printWindow = window.open('', '', 'height=200,width=400');
    printWindow.document.write('</head><body >');
    printWindow.document.write(divContents);
    printWindow.document.write('</body></html>');
    printWindow.document.close();
    printWindow.print();
    printWindow.close();
}

มันจะปิดหน้าต่างหลังจากคลิกปุ่มส่งหรือยกเลิก


0

บน IE11 เหตุการณ์ออนโฟกัสถูกเรียกสองครั้งดังนั้นผู้ใช้จะได้รับแจ้งสองครั้งเพื่อปิดหน้าต่าง สิ่งนี้สามารถป้องกันได้โดยการเปลี่ยนแปลงเล็กน้อย:

<script type="text/javascript">
  var isClosed = false;
  window.print();
  window.onfocus = function() {
    if(isClosed) { // Work around IE11 calling window.close twice
      return;
    }
    window.close();
    isClosed = true;
  }
</script>

0

สิ่งนี้ใช้ได้ผลสำหรับฉันใน FF 36, Chrome 41 และ IE 11 แม้ว่าคุณจะยกเลิกการพิมพ์และแม้ว่าคุณจะปิดกล่องโต้ตอบการพิมพ์ด้วย "X" ด้านขวาบน

var newWindow=window.open(); 
newWindow.document.open();
newWindow.document.write('<HTML><BODY>Hi!</BODY></HTML>'); //add your content
newWindow.document.close();
newWindow.print();      

newWindow.onload = function(e){ newWindow.close(); }; //works in IE & FF but not chrome 

//adding script to new document below makes it work in chrome 
//but alone it sometimes failed in FF
//using both methods together works in all 3 browsers
var script   = newWindow.document.createElement("script");
script.type  = "text/javascript";
script.text  = "window.close();";
newWindow.document.body.appendChild(script);

0
setTimeout(function () { window.print(); }, 500);
        window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน หวังว่าจะช่วยได้


0

สิ่งนี้ใช้ได้กับฉันบน Chrome (ยังไม่ได้ลองกับคนอื่น)

$(function(){
    window.print();
    $("body").hover(function(){
        window.close();
    });
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.