Chrome window.print()window.close()导致'打印预览失败'。解?

时间:2011-10-04 19:22:26

标签: javascript google-chrome

我有一个在新标签页或窗口中打开的打印页面。结果页面打开一个打印对话框。用户在打印对话框上进行选择后,页面将关闭选项卡/窗口。

window.print();
window.close();

这曾经在主流浏览器中运行良好,但Chrome的最新版本之一打破了这一点(即14.0.835.202)。

我从Chrome打印插件中收到以下消息:“打印预览失败”。

有没有人有解决方案可以在打印后关闭Chrome标签页/窗口?

13 个答案:

答案 0 :(得分:31)

我刚刚设法找到适合我的解决方案。我从秘鲁的回复开始,但不想在这个解决方案中使用jQuery。

window.onload = function () {
  window.print();
  setTimeout(function(){window.close();}, 1);
}

由于某些原因,Chrome在关闭打印对话框之前不会启动超时计时器。

答案 1 :(得分:10)

这个问题在谷歌上是最受欢迎的,所以我想我会添加我发现的内容,即使它并不完全反映你的情况。如果您有一个调用window.print()的链接,那么其onclick处理程序必须返回false,否则您将收到错误消息。即使链接是哈希并且无处可去也是如此!

  

打印不可用,因为您尝试打印的页面已关闭

要解决此问题,请确保在链接中添加return false。

<a href="#" onclick="window.print(); return false;" >Print</a>

以下是解决此问题的Chromium错误。 Chrome 17已标记为已修复(尚未发布),我已在Chrome 18中验证了此修复程序。

http://code.google.com/p/chromium/issues/detail?id=92107

答案 2 :(得分:6)

我认为没有任何标准化的打印事件。 IE has a couple,但我意识到这对Chrome没有帮助。

我认为你可能只有两种选择。使用setTimeout手动关闭按钮或某种形式的延迟。

答案 3 :(得分:5)

类似的问题,我有。

仅供参考,包括VER 17+ 我正在使用jquery插件,printElement,并找到了一种方法来编辑它,所以我可以关闭窗口,即使在chrome ...然后他们更新到这个新的打印东西! 我又有了一个解决方案。

  

<强>上

Chrome used to open a seperate window containing just the element i wanted 
printed and its relative css.  That window then spawned the .print command 
which opened another window containing print preview. By adding a simple 50 
millisecond timeout i was able to close the previous window without hurting 
the print preview.
     

新问题

Chrome no longer opens a new window for their print preview. Instead it 
opens a "dialog with overlay" in the current page to be printed (aka, our 
new blank page containing just the element for print). Thus, when my timer 
kicked in, it wouldn't close the page immediately, but as soon as the dialog 
code closed.  The problem was, it closed so fast, the print command never 
made it to its service and thus nothing was printed to pdf 
(what our clinic uses).
     

新解决方案

     

我知道增加计时器没有任何帮助,因为它会在结束时关闭并且仍然可以停止打印对话框。相反,我将最新的jquery构建的脚本链接添加到新的about页面的标题,然后将鼠标悬停添加到要打印的页面主体。在悬停...关闭!并猜猜是什么......它的工作完美!!!

     

总之,如果你使用空白页面打印铬并需要在你的元素/打印之后关闭页面,只需在该页面的主体上添加一个悬停事件(或者在内部html上)关上窗户。然后,当您选择了打印方法并点击打印时,它将打印并关闭对话框,留下那个烦人的窗口。只需将您的鼠标移动一个scooch和VIOLA!烦人的弹出窗口已经过去了!

答案 4 :(得分:3)

上面的所有解决方案都没有解决我的问题,使用此代码解决了我的问题

setTimeout(function () {
        mywindow.print();
        mywindow.close();
    }, 1000); 

答案 5 :(得分:2)

将此脚本添加到弹出式打印窗口

<script src="/assets/print_window_close.js" type="text/javascript"></script>

print_window_close.js的内容是

jQuery(document).ready(function() {

    setTimeout(function() {
        window.close();
    }, 1);

});

基本上只有当文档聚焦时才会调用seTimeout,只有在关闭覆盖打印对话框时才会发生。因此,这与您想要的完全相同。

答案 6 :(得分:1)

对我来说,我无法找到解决方案,所以我创建了一个。

我所做的是创建一个不可见的文本框,并在调用window.print()后每50ms使用一次setInterval来关注它。此外,我将onfocus事件绑定到文本框,当它被解雇时,我关闭窗口。这是在Chrome,Firefox和Internet Explorer上测试的。

&#13;
&#13;
window.print();
setInterval(function () {
  document.getElementById("focustext").focus();
}, 50);
document.getElementById("focustext").onfocus = function () { window.close(); }
&#13;
#focustext {
  border: none;
  height: 0px;
  width: 0px;
}
&#13;
<input id="focustext" type="text" />
&#13;
&#13;
&#13;

答案 7 :(得分:0)

我目前的黑客攻击。基本上,就在window.print()之后,我绑定了mousemove,click和keypress来触发我想要的动作(window.close();或window.location.href = somewhere;)。当用户执行时,确实不会发生操作。但它的效果非常好。 (好吧,我可以忍受,直到至少纠正错误)

/* 
// alternative to window.print() for dedicated print windows (had issue with <body onload=window.print()...
// not used anymore.
$('<a id="aprint" href="#" onclick="return window.print()" class="invisible"></a>').appendTo('body');
$('#aprint').trigger('click');
*/
$('body, select, input, textarea, button, submit, form').prop('disabled', true);
window.print();
setTimeout(function() {
    $('body').bind('mousemove click keypress', function () {
        window.location.href=home;                      
    });
}, 200);    

答案 8 :(得分:0)

我的解决方案:

window.print();
if(/Chrome/.test(navigator.userAgent)){
  $(window).focus(function(){
    window.location = '/print-thank-you';
  });
} else {
  window.location = '/print-thank-you';
}

编辑:在Chrome版本上打印&gt; = 17就像IE / FF一样,所以请确保您也考虑到这一点

答案 9 :(得分:0)

经过一个下午的研究并感谢@ SpYk3HH的回答,我找到了一个适用于我目前正在运行的版本的解决方案:

IE:9.0.8 ......

FireFox:15.01

Chrome:23.0.1271.97 m

Safari:5.1.7

准备要在特定打印页面上显示的html时,请检查

if (oWindow == null || oWindow.closed || typeof(oWindow) == "undefined")

然后通知用户暂时启用弹出窗口。为了让你的页面打开,显示打印对话框并关闭打印对话框,关闭将此功能添加到窗口主体的onload功能中:

function PrintPage()
{
    self.print();
    self.onmouseover = (function() { window.close(); }
}

这样做的原因是因为从根本上说我们还在处理对象和事件。浏览器在某些方面可能表现不同,但它们都有共同点。希望总是在窗口获得焦点时发生简单的onmouseover事件,因此希望此代码不会失去其相关性。

答案 10 :(得分:0)

对我来说很好......

var newWin = window.open('', '');
//htmlPage is your html content 
setTimeout(newWin.document.write(htmlPage),1000);
// newWin.document.body.innerHTML = htmlPage;
newWin.document.close();
newWin.focus();
setTimeout(newWin.print(), 10000);
newWin.document.close();
newWin.close();
return false;

答案 11 :(得分:0)

今天测试适用于IE,FF,Chrome (including preview fix for chrome)

    setTimeout(function () { window.print(); }, 500);
    window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }

答案 12 :(得分:0)

现在,我们有了以下事件:WindowEventHandlers.onafterprint(https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onafterprint)。

通过此事件,您可以执行以下操作:

window.onafterprint = function() { 
    window.close();
};
window.print();