如何在打印事件上触发javascript?

Joe*_*Joe 27 javascript browser printing

当用户打印页面时是否可以触发javascript事件?当用户选择打印页面时,我想删除对javascript库的依赖,因为该库非常适合屏幕但不适合打印.

知道怎么做到这一点?

Aej*_*jay 32

对于任何绊倒谷歌这个答案的人,让我试着清理一下:

正如Ajay指出的那样,有两个事件被打印用于打印,但它们没有得到很好的支持; 据我所知,它们仅在Internet Explorer和Firefox(6+)浏览器中受支持.那些事件是window.onbeforeprint和window.onafterprint,它们(如你所料)将在打印作业之前和之后触发.

但是,正如Joe的链接(/sf/answers/694454911/)所指出的那样,并不是所有情况下的实现方式.在大多数情况下,两个事件都在对话之前触发; 在其他情况下,脚本执行可能会在打印对话框中暂停,因此两个事件可能同时触发(在对话框完成后).

有关这两个事件的更多信息(和浏览器支持):

https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeprint

https://developer.mozilla.org/en-US/docs/DOM/window.onafterprint

简短的回答:如果您希望干扰打印流程,请不要.如果你希望在打印后触发代码,它就不会像你想要的那样工作; 期望糟糕的浏览器支持,并尝试优雅地降级.

  • 此外,如果您正在尝试更改打印的布局或显示,您应该使用打印样式表(或css中的`@media print`规则)而不是JavaScript (2认同)
  • @TomPietrosanti 我完全同意,但是有些事情你不能用 CSS 来做(比如改变元素的顺序)。请参阅[我的问题](http://stackoverflow.com/questions/25030208/dom-manipulation-on-print-only)。 (2认同)

Dan*_* K. 13

它可以通过覆盖来完成,例如window.onbeforeprint.

使用Chrome,我发现更多的奥术window.matchMedia("print").addListener(function() {alert("Print Dialog open.")})也有效.

可以使用这个有争议的特征来阻止用户打印页面.

我第一次在Scribd上遇到过它.在那里,如果使用菜单命令打开打印对话框,页面内容将显示为灰色,并显示警告弹出消息,说明无法打印页面的原因.(注意完整分析:在该页面上,control-p也被覆盖,因此您根本无法使用它来打开打印对话框.此外,还有一个用于打印机输出的@media CSS隐藏内容;所有在Firefox上测试).

  • 我想如果你有多种打印样式或打印样式表,那么你可以使用多种打印样式或打印样式表.当我运行没有打印样式的代码时,它运行一次. (2认同)
  • 从 Chrome 63 开始,Chrome 现在支持 `window.onbeforeprint` 和 `window.onbeforeprint`。 (2认同)