iOS 8 Safari打印重定向不停止JavaScript执行

9
我需要提供在保存成功后打印标签并重定向到搜索页面的功能。这在chrome、firefox、ie、iOS 6/7 safari等浏览器中都有效。然而,在iOS 8中,当从javascript发出window.print()时,似乎不再停止javascript的执行。
如果您使用连接到计算机的iOS 8 Safari导航到this jsfiddle example并单击“打印”按钮,您将看到在打印对话框弹出时console.log会触发。因此,如果您想打印然后导航,您将打印错误的屏幕,除非您有足够时间来点击打印,但在这种情况下是不可接受的。
我进行了人为延迟,因为在iOS 6/7中,这似乎可以使打印对话框最终停止javascript的执行。在那种情况下,500毫秒就足以使其工作。
有其他人在从Safari的iOS 8中执行类似操作时遇到过此问题吗?他们是否引入了新的事件来监听,我可以用它来实现这个功能?
// Example Code
window.print();
setTimeout(function() {
    console.log('This should print after the print is issued in the iOS print dialog.');
}, 500);

以下内容可能适用于以前的chrome版本,但似乎并不完全正确,因为setTimeout会修复它... 在打印预览中打印窗口关闭结果 - Corey W
我仍然很好奇是否有人找到了解决方案,所以请随时回复并让我知道。现在我将不得不查看iOS 8的用户代理,并为打印和重定向放置不同的流程,使其成为手动触摸继续类型的事情。提前致谢! - Corey W
1个回答

8
您可以使用 window.matchMediacaniuse链接)结合 window.onbeforeprintwindow.onafterprint(用于早期的IE支持)。有关使用matchMedia的良好参考资料可在此处找到这里
为了满足在iOS上使用 matchMedia,请使用嵌套事件。首先,监听媒体类型更改为print。然后,在该回调内,监听媒体是否更改回screen
if (window.matchMedia) {
    var printQuery = window.matchMedia('print');
    printQuery.addListener(function() {
        var screenQuery = window.matchMedia('screen');
        screenQuery.addListener(function() {
            //actions after print dialog close here
        });
    });
}

第5行应该改为screenQuery.addListener(function() { ...,是吗? - 3Dom
1
@3Dom,我相信你是正确的。我已经纠正了它。谢谢! - Ben Vassmer
这段代码似乎在 iOS 12.1.2 中弹出打印对话框时立即触发。 - Karen Zilles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接