是否可以检测用户何时从浏览器打印内容?
更复杂的是,如果我们在新窗口中向用户展示PDF文档,是否可以检测该文档的打印(假设用户从浏览器窗口打印)?
我能找到的最接近的是我们是否实现了自定义打印功能(类似this)并跟踪何时调用
我主要关注适用于Internet Explorer(6或更高版本)的解决方案
答案 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.onbeforeprint
和window.onafterprint
,但它们不能与任何其他浏览器一起使用,因此它们通常无用。
由于某种原因,它们似乎完全相同,都在打印窗口打开之前执行它们的事件处理程序。
但是如果你想要它,尽管有这些警告,这里有一个例子:
window.onbeforeprint = function() {
alert("Printing shall commence!");
}
答案 2 :(得分:2)
如果仅用于跟踪目的,也许您可以将CSS打印介质中的后台URL设置为服务器页面(.aspx,.php等),然后在服务器上执行某些操作?
这不像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)
}
}
}