检测浏览器打印事件

时间:2009-08-05 15:30:27

标签: pdf browser printing

是否可以检测用户何时从浏览器打印内容?

更复杂的是,如果我们在新窗口中向用户展示PDF文档,是否可以检测该文档的打印(假设用户从浏览器窗口打印)?

我能找到的最接近的是我们是否实现了自定义打印功能(类似this)并跟踪何时调用

我主要关注适用于Internet Explorer(6或更高版本)的解决方案

4 个答案:

答案 0 :(得分:103)

现在,您可以使用以下技术检测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/

答案 1 :(得分:5)

对于Internet Exploder,有事件window.onbeforeprintwindow.onafterprint,但它们不能与任何其他浏览器一起使用,因此它们通常无用。

由于某种原因,它们似乎完全相同,都在打印窗口打开之前执行它们的事件处理程序。

但是如果你想要它,尽管有这些警告,这里有一个例子:

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

答案 2 :(得分:2)

如果仅用于跟踪目的,也许您可​​以将CSS打印介质中的后台URL设置为服务器页面(.aspx,.php等),然后在服务器上执行某些操作?

This guy claims it works.

这不像TJ的解决方案那样多,但是当需要跟踪时,它可能不那么错(参见他发现的问题的TJ博客文章)。

答案 3 :(得分:1)

适合任何在2020年阅读此书的人。 除了Safari之外,addListener函数大多已被addEventListener取代:

if (window.matchMedia) {
  const media = window.matchMedia("print");
  const myFunc = mediaQueryList => {
    if (mediaQueryList.matches) {
      doStuff();
    }
  };
  try {
    media.addEventListener("change", myFunc);
  } catch (error) {
    try {
    media.addListener(myFunc);
    } catch (error) {
      console.debug('Error', error)
    }
  }
}

参考:This other S.O question