Check for when a user has selected to print using javascript

前端 未结 2 1134
温柔的废话
温柔的废话 2020-12-10 00:05

When a user chooses \"File > Print\" on a browser such as Firefox or Internet Explorer, or clicks on a link that runs the below javascript

window.print();


        
相关标签:
2条回答
  • 2020-12-10 00:45

    You can do:

    window.old_print=window.print
    window.print=function() {
        alert('doing things');
        window.old_print();
    }
    

    but this will only catch calls to print() from inside the page javascript.

    Did you try putting !important on print-specific stylesheet?

    0 讨论(0)
  • 2020-12-10 00:48

    There's a universal solution for this, along with a bit of hackery for older browsers. You can override the print() method in all browsers:

    (function (oldPrint) { 
        window.print = function () {
            document.getElementById("hideThis").style.display = 'none';
            oldPrint();
        }
    })(window.print);
    

    The problem here is that it will not fire for users pressing Ctrl+P or accessing the file menu to print. Internet Explorer has a solution by way of the onbeforeprint event:

    if ("onbeforeprint" in window) {
        var hideEl = document.getElementById("hideThis");
        window.onbeforeprint = function () { 
            hideEl.style.display = 'none';
        }
        window.onafterprint = function () {
            hideEl.style.display = '';
        }
    }
    

    As for other browsers, you can add an event listener to a print MediaQueryList as detailed by TJ VanToll in another answer:

    if (window.matchMedia) {
        var mqList = window.matchMedia("print"),
            hideEl = document.getElementById("hideThis");
    
        mqList.addListener(function (mql) {
            hideEl.style.display = mql.matches ? 'none' : '';
        }); 
    }
    

    And putting it all together:

    (function () {
        var hideEl = document.getElementById("hideThis");
    
        // HTML5 spec, IE 5.5+, Firefox 6.0+
        if ("onbeforeprint" in window) {
            window.onbeforeprint = function () { 
                hideEl.style.display = 'none';
            }
            window.onafterprint = function () {
                hideEl.style.display = '';
            }
        }
    
        // Chrome 9+, Opera 12.1+, Safari 5.1+
        else if (window.matchMedia) {
            var mqList = window.matchMedia("print");
    
            mqList.addListener(function (mql) {
                hideEl.style.display = mql.matches ? 'none' : '';
            }); 
        }
    
        // Your fallback method, only working for JS initiated printing
        else {    
            (function (oldPrint) { 
                window.print = function () {
                    hideEl.style.display = 'none';
                    oldPrint();
                }
            })(window.print);
        }
    })();
    
    0 讨论(0)
提交回复
热议问题