在Chrome浏览器的JavaScript window.print(),closures新的窗口或选项卡,而不是取消打印叶JavaScript阻止父窗口

在我工作的应用程序中,我们有几个用户可以打印的不同的地方。 在所有这些情况下,我们使用相同的工作stream程打开一个新的窗口(或标签),将我们需要打印的任何东西写到新窗口的文档中,然后调用

$(w.document).ready(function () { w.focus(); w.print(); w.close(); }); 

我看到的问题是,在Chrome中,如果我closures了打开预览而不是点击取消button的标签或窗口,Chrome浏览器仍然会阻止我的父窗口上的JavaScript。

这与这里描述的问题类似:

Google Chrome在子窗口上打开预览时阻止Ajax请求

我们也遇到了这个问题,但是我相信这是我们如何在新窗口中实现打印以及Chrome打印预览工作方式的结果。 在IE和Firefox中,打印窗口显示模式对话框,在打印窗口closures之前,您无法在父窗口中执行任何操作。 同样,在打印预览被取消之前,chrome阻止使用父窗口。 不过,我希望closures该选项卡或窗口的工作相同,取消打印。
有没有其他人有这个问题或知道一个好的解决scheme?

谢谢!

看起来问题已经通过最新的Chrome更新解决了…我正在运行Chrome版本36.0.1964.4 dev-m。

我也被限制在警告用户通过执行以下操作来closures打印预览窗口:

 if(navigator.userAgent.toLowerCase().indexOf('chrome') > -1){ // Chrome Browser Detected? window.PPClose = false; // Clear Close Flag window.onbeforeunload = function(){ // Before Window Close Event if(window.PPClose === false){ // Close not OK? return 'Leaving this page will block the parent window!\nPlease select "Stay on this Page option" and use the\nCancel button instead to close the Print Preview Window.\n'; } } window.print(); // Print preview window.PPClose = true; // Set Close Flag to OK. } 

现在Chrome更新后,警告不再出现。

问题是在popup窗口中有一个浏览器内的打印对话框。 如果立即调用window.close() ,那么用户不会看到对话框。 用户需要点击对话框中的“打印”。 这与打印对话框是OS一部分的其他浏览器不一样,它会阻塞window.close()直到被解散 – 在Chrome上,它是Chrome的一部分,而不是操作系统。

这是我使用的代码,在由父窗口创build的一个小的popup窗口中:

 var is_chrome = function () { return Boolean(window.chrome); } window.onload = function() { if(is_chrome){ /* * These 2 lines are here because as usual, for other browsers, * the window is a tiny 100x100 box that the user will barely see. * On Chrome, it needs to be big enough for the dialogue to be read * (NB, it also includes a page preview). */ window.moveTo(0,0); window.resizeTo(640, 480); // This line causes the print dialogue to appear, as usual: window.print(); /* * This setTimeout isn't fired until after .print() has finished * or the dialogue is closed/cancelled. * It doesn't need to be a big pause, 500ms seems OK. */ setTimeout(function(){ window.close(); }, 500); } else { // For other browsers we can do things more briefly: window.print(); window.close(); } } 

对于那些popup一个新窗口打印的用户,然后在用户点击Chrome打印预览中的“打印”或“取消”后自动closures,我使用了以下内容(感谢PaulVB的回答) :

 if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) { var showPopup = false; window.onbeforeunload = function () { if (showPopup) { return 'You must use the Cancel button to close the Print Preview window.\n'; } else { showPopup = true; } } window.print(); window.close(); } else { window.print(); window.close(); } 

我正在辩论,如果这也是一个好主意,也过滤的Chrome版本…

Chrome打印通常是一个扩展页面,因此在现有页面中没有发生dom附件。 您可以使用命令行apis(window.print())触发打印命令,但是由于select打印选项,打印机,计数等原因不同,因此没有提供closures它的API。

使用此代码返回并重新加载当前窗口:

 function printpost() { if (window.print()) { return false; } else { location.reload(); } } 

我可以确认使用Chrome版本35在Windows 7上有同样的错误,但我分享了我的部分解决scheme,他在Chrome上打开了一个新选项卡并显示对话框。

对于其他浏览器当用户点击取消时自动closures新的打印窗口。

 //Chrome's versions > 34 is some bug who stop all javascript when is show a prints preview //http://stackoverflow.com/questions/23071291/javascript-window-print-in-chrome-closing-new-window-or-tab-instead-of-cancel if(navigator.userAgent.toLowerCase().indexOf('chrome') > -1) { var popupWin = window.open(); popupWin.window.focus(); popupWin.document.write('<!DOCTYPE html><html><head>' + '<link rel="stylesheet" type="text/css" href="style.css" />' + '</head><body onload="window.print()"><div class="reward-body">' + printContents + '</div></html>'); popupWin.onbeforeunload = function (event) { return 'Please use the cancel button on the left side of the print preview to close this window.\n'; }; }else { var popupWin = window.open('', '_blank', 'width=600,height=600,scrollbars=no,menubar=no,toolbar=no,location=no,status=no,titlebar=no'); popupWin.document.write('<!DOCTYPE html><html><head>' + '<link rel="stylesheet" type="text/css" href="style.css" />' + '</head><body onload="window.print()"><div class="reward-body">' + printContents + '</div>' + '<script>setTimeout(function(){ window.parent.focus(); window.close() }, 100)</script></html>'); } popupWin.document.close(); 

如果setTimeout函数不适用于您,请执行以下操作:

 //Create an iframe iframe = $('body').append($('<iframe id="documentToPrint" name="documentToPrint" src="about:blank"/>')); iframeElement = $('#documentToPrint')[0].contentWindow.document; //Open the iframe iframeElement.open(); //Write your content to the iframe iframeElement.write($("yourContentId").html()); //This is the important bit. //Wait for the iframe window to load, then print it. $('#documentToPrint')[0].contentWindow.onload = function () { $('#print-document')[0].contentWindow.print(); $('#print-document').remove(); }; iframeElement.close(); 

好的,这里是我的工作! 我的左侧导航栏上有一个button。 如果你点击它将打开一个窗口,该窗口将加载一个文件。 加载文档后,我想打印文档,然后立即closurespopup窗口。

 contentDiv.focus(); contentDiv.contentWindow.print(); contentDiv.contentWindow.onfocus = function() { window.close(); }; 

为什么它工作?
那么,打印后,你设置onfocus事件closures窗口。 打印popup窗口的载入速度非常快,以至于在1)打印2)取消打印之前,聚焦事件将无法触发。 一旦你重新聚焦到窗户,窗户将closures!
我希望这会为你工作

我已经mandained一些类似的页面(经典asp …)

我的方法是直接在popup框中使用Q promise。

例如,我的问题是,popup我想打印本身太快…和打印previw是空的,我解决了这个问题:

来电者:

 var popup = window.open("index.asp","popupwindow","width=800,height=500,left=200,top=5,scrollbars,toolbar=0,resizable"); 

popup窗口(在页面的结尾处):

 <script src="/Scripts/jquery-1.9.1.min.js"></script> <script src="/Scripts/q.min.js"></script> <script type="text/javascript"> Q(window.print()).then(function () {window.close();}); </script> 

我认为你的“父母锁”可以用类似的方式解决

我会尝试 :

 var w = whatever; Q( // fill your popup ).then(function () { w.print(); }).then(function () { w.close(); }); 

这使得“打印”和“closures”asynchronous…所以父母将立即“解锁”