web-dev-qa-db-ja.com

ブラウザーの印刷イベントの検出

ユーザーがブラウザから何かを印刷していることを検出することは可能ですか?

問題を複雑にするために、ユーザーにPDFドキュメントを新しいウィンドウで表示する場合、そのドキュメントの印刷を検出することは可能ですか(ユーザーがブラウザーウィンドウから印刷すると仮定します)?

私が見つけた最も近いものは、カスタム印刷機能( this のようなもの)を実装し、それがいつ呼び出されるかを追跡する場合です。

主にInternet Explorer(6以降)で動作するソリューションに興味があります

47
TygerKrash

次の手法を使用して、IE 5 +、Firefox 6 +、Chrome 9+、およびSafari 5+で印刷要求を検出できるようになりました。

(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;
}());

http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/ で、これが何をして何に使用できるかについて詳しく説明します。

105
TJ VanToll

Internet Exploderには、イベントwindow.onbeforeprintおよびwindow.onafterprintしかし、他のブラウザでは動作しないため、通常は役に立たない。

これらは何らかの理由でまったく同じように動作するようで、どちらも印刷ウィンドウが開く前にイベントハンドラーを実行します。

しかし、これらの警告にもかかわらずとにかくそれを望むなら、ここに例があります:

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

追跡のみを目的とする場合は、おそらくCSS印刷メディアの背景URLをサーバーページ(.aspx、.phpなど)に設定してから、サーバー上で何かを実行できますか?

この男はそれが機能すると主張します。

これはTJのソリューションほど汎用的ではありませんが、追跡のみが必要な場合はバグが少ないかもしれません(彼が発見した問題についてはTJのブログ投稿を参照)。

2
Chris