检测浏览器打印事件

Tyg*_*ash 50 browser printing pdf

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

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

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

我主要对一个适用于Internet Explorer(6或更高版本)的解决方案感兴趣

TJ *_*oll 108

您现在可以使用以下技术在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;
}());
Run Code Online (Sandbox Code Playgroud)

我在http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/上详细介绍了这项工作以及可以使用的内容.

  • 这似乎不再适用于Windows上的Chrome 38.`beforePrint`永远不会开火.http://jsfiddle.net/o5oosa9o/(右键单击结果iframe并选择"打印...") (8认同)
  • 而且,一旦打印预览完成渲染,afterPrint现在就会在Chrome中激活 (3认同)
  • +1,非常好,我打算很快抄袭这个答案. (2认同)
  • 很抱歉碰到这个,但我从这里提出问题(http://stackoverflow.com/questions/28620711/extjs-4-creating-a-callback-for-an-override-function-for-printing-panel-conten ),如果我想检测实际按下"打印"按钮而不仅仅是用户发出的任何打印请求怎么办? (2认同)

Tee*_*kin 5

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

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

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

window.onbeforeprint = function() {
    alert("Printing shall commence!");
}
Run Code Online (Sandbox Code Playgroud)

  • 不知道 Internet Exploder 是不是打字错误,但它很棒 kkkk (3认同)

Car*_* R. 5

对于 2020 年阅读本文的任何人。该addListener函数大部分已被弃用,取而代之的是addEventListenerSafari 除外:

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)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

参考:另一个SO问题