web-dev-qa-db-fra.com

Détection d'un événement d'impression du navigateur

Est-il possible de détecter lorsqu'un utilisateur imprime quelque chose à partir de son navigateur?

Pour compliquer les choses, si nous présentons à un utilisateur un PDF dans une nouvelle fenêtre, est-il possible de détecter l'impression de ce document (en supposant que l'utilisateur l'imprime depuis la fenêtre du navigateur)?

Le plus proche que j'ai pu trouver est si nous implémentons une fonctionnalité d'impression personnalisée (quelque chose comme this ) et suivons quand cela est invoqué

Je suis principalement intéressé par une solution qui fonctionne pour Internet Explorer (6 ou version ultérieure)

47
TygerKrash

Vous pouvez désormais détecter une demande d'impression dans IE 5+, Firefox 6+, Chrome 9+ et Safari 5+ en utilisant la technique suivante:

(function() {
    var beforePrint = function() {
        console.log('Functionality to run before printing.');
    };
    var afterPrint = function() {
        console.log('Functionality to run after printing');
    };

    if (window.matchMedia) {
        var mediaQueryList = window.matchMedia('print');
        mediaQueryList.addListener(function(mql) {
            if (mql.matches) {
                beforePrint();
            } else {
                afterPrint();
            }
        });
    }

    window.onbeforeprint = beforePrint;
    window.onafterprint = afterPrint;
}());

J'entre plus en détail dans ce que cela fait et à quoi cela peut être utilisé à http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/ .

105
TJ VanToll

Pour Internet Exploder, il y a les événements window.onbeforeprint et window.onafterprint mais ils ne fonctionnent avec aucun autre navigateur et, par conséquent, ils sont généralement inutiles.

Ils semblent fonctionner exactement de la même manière pour une raison quelconque, tous deux exécutant leurs gestionnaires d'événements avant l'ouverture de la fenêtre d'impression.

Mais si vous le souhaitez malgré tout, malgré ces mises en garde, voici un exemple:

window.onbeforeprint = function() {
    alert("Printing shall commence!");
}
5
Teekin

Si c'est uniquement à des fins de suivi, vous pourriez peut-être définir une URL d'arrière-plan dans les supports d'impression CSS vers une page de serveur (.aspx, .php, etc.), puis faire quelque chose sur le serveur?

Ce mec prétend que ça marche.

Ce n'est pas aussi polyvalent que la solution de TJ, mais cela peut être moins bogué (voir le blog de TJ pour les problèmes qu'il a trouvés) lorsque seul le suivi est nécessaire.

2
Chris