【问题标题】:Detect print events from iFrame从 iFrame 检测打印事件
【发布时间】:2016-12-07 08:42:55
【问题描述】:

我正在尝试构建一个打印解决方案,它使用 URL 以编程方式打印 PDF 文档并在打印后触发一个事件。

我正在使用下面的“matchMedia”事件侦听器来测试 Chrome (v54)。对于 IE 和 Firefox,我打算监听同一个 iframe contentWindow 对象的“onbeforeprint”和“onafterprint”。

这是我调用打印的方式。 dojo 函数只是一个 xhr 包装器。

                dojoRequest(url, {
                    handleAs: 'blob'
                }).then(function (blob) {
                    var src = URL.createObjectURL(blob);

                    printFrame = document.createElement('iframe');
                    printFrame.id = 'print-frame';
                    // printFrame.style.display = 'none';
                    printFrame.src = src;
                    document.body.appendChild(printFrame);

                    var mediaQueryList = printFrame.contentWindow.matchMedia('print');
                    mediaQueryList.addListener(function (mql) {
                        console.log('print event', mql);
                        debugger;
                    });

                    setTimeout(function () {
                        printFrame.contentWindow.print();
                    }, 0);
                });

这很好用,只是“打印事件”事件永远不会触发。我希望它在显示“打印预览”窗口时触发一次,并在单击“打印”按钮后再次触发。

我尝试针对主“窗口”对象注册相同的事件侦听器。它在手动启动打印(从“文件”菜单)时触发,但在使用上述方法以编程方式启动打印时不会触发。

【问题讨论】:

    标签: javascript google-chrome iframe printing


    【解决方案1】:

    要获取事件,您必须将代码封装在 iframe 的 onload 中,如下所示:

    printFrame.onload = function () {
      var mediaQueryList = printFrame.contentWindow.matchMedia('print');
      mediaQueryList.addListener(function (mql) {
        console.log('print event', mql);
      });
    
      setTimeout(function () {
        printFrame.contentWindow.print();
      }, 0);
    };
    

    但是,我仍然认为这种方法确实很复杂,对于企业应用来说不够稳定。

    更新:

    显示它适用于 Chrome 54 的 Jsfiddle 链接:https://jsfiddle.net/anhhnt/nj851e52/

    【讨论】:

    • 谢谢!我会试试的。您是否有更简单的“企业级”方法?我从 pdf.js 得到这个:github.com/mozilla/pdf.js/issues/5397
    • 不幸的是,将逻辑放在上面建议的 onload() 函数中似乎没有什么不同。
    • 我创建了一个小提琴,你能再检查一下@FredericFortier
    • 你是对的。它是孤立地工作的。一定是有别的东西妨碍了。我会单独调查。此解决方案确实可以正常工作。
    • 嗨@FredericFortier。您是否找到解决 iframe 的这种方法的解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2013-09-22
    • 2011-01-26
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多