Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript弹出打印页面阻止父操作_Javascript_Jquery - Fatal编程技术网

Javascript弹出打印页面阻止父操作

Javascript弹出打印页面阻止父操作,javascript,jquery,Javascript,Jquery,我有一个父页面调用子弹出页面来显示打印页面。重定向到打印页面后,如果关闭子页面,我可以在父页面中执行其他活动,但当我最小化子页面(打印页面)并尝试某些活动时,它没有响应,关闭子页面后,我所做的一切都是在重新创建 代码: var chartDiv=document.getElementById('innerchartdiv'); var outerContainerDiv=document.getElementById('outerContainer'); var divToPrint=chart

我有一个父页面调用子弹出页面来显示打印页面。重定向到打印页面后,如果关闭子页面,我可以在父页面中执行其他活动,但当我最小化子页面(打印页面)并尝试某些活动时,它没有响应,关闭子页面后,我所做的一切都是在重新创建

代码:

var chartDiv=document.getElementById('innerchartdiv'); var outerContainerDiv=document.getElementById('outerContainer'); var divToPrint=chartDiv.innerHTML; setTimeout(函数(){ var popupWin=window.open(“,”U blank“,”宽度=800px,高度=800px”); popupWin.document.open(); popupWin.document.write(“”+图表+“”); popupWin.document.close(); popupWin.focus(); popupWin.print(); popupWin.close();
不幸的是,如果你在弹出窗口中调用print,它就像一个警告框,它会阻止线程!我以前遇到过这个问题,答案是print对话框总是会阻止JS线程

这就是原因,许多网站在新选项卡中打开生成的PDF,而不是使用打印对话框。我知道这不是您想要的答案,但这就是为什么人们也使用自定义警报框。阻止用户界面执行JS会破坏用户体验,并停止所有动画和事件的触发,直到您单击为止

备选建议: 你无法控制JS的弹出窗口,它实际上必须是一个超链接。但是,没有服务器也可以做到这一点。客户端PDF生成工具和“Blob URL”在现代浏览器中工作,因此你也可以生成客户端PDF。试试看,我没有用过,但它可能会奏效

此外:


跨浏览器打印css和大小不是很统一,因此,如果您想控制布局,PDF生成也是确保页面按预期方式打印的最简单的选择。我不太喜欢PDF格式,但这就是它如此流行的原因。

是的,尽管从技术上讲它是一个新的弹出窗口,但它是ill在同一个JS线程上。完整的新窗口/新选项卡选项是我找到的唯一好的解决方案。即使我使用新选项卡创建,它也不起作用。你不能从JS控制它,它必须只是一个超链接。显然,这意味着打印对任何没有服务器端生成访问权限的人来说都很糟糕…但是是另一个选项。有一些客户端PDF生成工具和“Blob URL”,所以你也可以生成客户端PDF。试试看,我没有用过这个工具,但它可能会起到作用。我会在回答中添加这一点。在客户端有一些其他库来生成PDF,但其中一些库需要使用Node.js和browserify。因为我在回答中没有提出,但是有很多选择。我希望打印对话没有冻结JS的执行,但这就是生活!
var chartDiv = document.getElementById('innerchartdiv');
var outerContainerDiv = document.getElementById('outerContainer');
var divToPrint = chartDiv.innerHTML;
setTimeout(function(){
var popupWin = window.open('', '_blank', 'width=800px,height=800px');
popupWin.document.open();
popupWin.document.write('<html><body align="center" style="margin:0% 17%;font-size:9px;">' +     chart+'</html>');
popupWin.document.close();
popupWin.focus();
popupWin.print();
popupWin.close();