有没有可能检测到用户从其浏览器打印某些内容?
更复杂的是,如果我们在新窗口中向用户呈现PDF文档,是否可以检测到该文档的打印(假设用户从浏览器窗口打印它)?
我能找到的最接近的解决方案是,如果我们实现自定义打印功能(类似于这个),并跟踪何时调用它。
我主要关注适用于Internet Explorer(6或更高版本)的解决方案。
你现在可以使用以下技术在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/上详细解释这段代码的作用及其用途。
window.onbeforeprint
和window.onafterprint
,但它们不适用于其他浏览器,因此它们通常是无用的。出于某种原因,它们似乎完全相同,都在打印窗口打开之前执行其事件处理程序。window.onbeforeprint = function() {
alert("Printing shall commence!");
}
对于2020年以后阅读此文的人,addListener
函数大多已被废弃,推荐使用addEventListener
,但在Safari浏览器中除外:
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)
}
}
}
onbeforeprint
在Chrome/Safari上的支持,早该知道不应该离开SO这个温暖的怀抱。 - PatbeforePrint
事件不会触发。http://jsfiddle.net/o5oosa9o/ (右键单击结果iframe,选择“打印...”) - Michael