Javascript Chrome中的打印功能不再工作

Javascript Chrome中的打印功能不再工作,javascript,google-chrome,window.open,Javascript,Google Chrome,Window.open,我们的网站有一个可以打印会员资料的功能。它的工作方式是通过onsubmit将javascript函数附加到按钮。javascript函数使用window.open以特殊模式重新打开页面,重新显示打印机友好版本的页面 这项功能大约从2008年就开始使用,并且可以在所有浏览器中使用。除了大约一周前,它已经停止在Chrome中工作。使用Chrome时,打开的窗口确实会打开,但另一个空白窗口会短暂打开,然后所有窗口都会关闭 在寻找关于这个问题的讨论时,我找不到确切的问题,但确实找到了一些东西,说应该在提

我们的网站有一个可以打印会员资料的功能。它的工作方式是通过onsubmit将javascript函数附加到按钮。javascript函数使用window.open以特殊模式重新打开页面,重新显示打印机友好版本的页面

这项功能大约从2008年就开始使用,并且可以在所有浏览器中使用。除了大约一周前,它已经停止在Chrome中工作。使用Chrome时,打开的窗口确实会打开,但另一个空白窗口会短暂打开,然后所有窗口都会关闭

在寻找关于这个问题的讨论时,我找不到确切的问题,但确实找到了一些东西,说应该在提交中添加一个“return false”。我试着加上那个,但没用

以下是onsubmit的外观:

<button onclick="PrintEmailSubmit('print');">Print Profile</button>
window.open('print-email-profile.php?mode=' + mode,'','width=' + width + ',height=' + height + ',scrollbars=yes,location=0,menubar=1,status=0,toolbar=0')
虽然不必查看,但下面是整个函数PrintEmailSubmit():

最后,这项工作的原因是页面的特殊版本在body标记中添加了以下内容:

<body onload="window.print();window.close();">

如上所述,该功能在IE和Firefox中仍然有效。只是Chrome有这个问题


有什么想法吗?

按钮和窗口。打开确实与您的问题无关

问题是,Chrome在打印之前需要用户输入。print()打开打印对话框窗口,但Chrome不会等待您完成打印。window.close()正在关闭打印对话框窗口以及父窗口中的所有其他内容

为了节省时间,请注意OnAfterPrint钩子根本不被Chrome使用。我还尝试将window.close()放在onLoad中,将window.print()放在onbeforeuload中,但是打印对话框取消了window.close()。下一个最好的办法是做如下事情:

//In your profile print page
<html>
<head>
<script>
var is_chrome = function () { return Boolean(window.chrome); }
if(is_chrome) 
{
   window.print();
   setTimeout(function(){window.close();}, 10000); 
   //give them 10 seconds to print, then close
}
else
{
   window.print();
   window.close();
}
</script>

<body onLoad="loadHandler();">
//在您的个人资料打印页面中
var是_chrome=function(){return Boolean(window.chrome);}
如果(是铬)
{
window.print();
setTimeout(函数(){window.close();},10000);
//给他们10秒钟打印,然后关闭
}
其他的
{
window.print();
window.close();
}

我还没有对此进行过测试,但我认为它相当有效地证明了这个想法。

我找到了这个解决方案,它确实有效:

<body onload="window.print();window.onmouseover = function() { self.close(); } ">

Chrome速度如此之快,以至于它实际上在加载文档之前调用打印。这就是为什么最好的方法是将打印功能移动到onload,如Mari或如下所示:

winPrint = window.open("", "winPrint", "width=1,height=1");
winPrint.document.write(html);
winPrint.onload = function () {
    window.print();
    window.close();
};
而o.c.它在IE中不起作用,所以完整的代码应该是这样的

var is_chrome = Boolean(window.chrome);
if (is_chrome) {
    winPrint.onload = function () {
        window.print();
        window.close();
    };
}
else {
    winPrint.print();
    winPrint.close();
}

我使用了bresleveloper先生的解决方案,但做了一些更改:

var is_chrome = Boolean(window.chrome);
if (is_chrome) {
    winPrint.onload = function () {
        setTimeout(function () { // wait until all resources loaded 
            winPrint.print();  // change window to winPrint
            winPrint.close();// change window to winPrint
        }, 200);
    };
}
else {
    winPrint.print();
    winPrint.close();
}
//在您的个人资料打印页面中
var是_chrome=function(){return Boolean(window.chrome);}
如果(是铬)
{
window.print();
setTimeout(函数(){window.close();},10000);
//给他们10秒钟打印,然后关闭
}
其他的
{
window.print();
window.close();
}
这个很好用


谢谢

这种方法也有同样的问题

   window.print();
   window.close();
即使识别出浏览器,然后执行相应的代码也是好的。但这是一个非常方便快捷的解决方案,只需两行代码即可解决此问题

   document.execCommand('print');
   window.close();

chrome
IE

中工作得非常好,是chrome的弹出窗口拦截器阻止了它吗?您应该会收到通知,控制台是否会显示任何错误?如果不是太长,请包含用于PrintEmailSubmit的JS。它在没有窗口的情况下工作。关闭?Badr Hari:奇怪的是,它已经在所有浏览器中运行了6年,但现在不适用于Chrome。从body onload中取出window.close实际上允许打印功能在Chrome上工作,但它会使打印友好型窗口保持打开状态。这就指向了解决方案的方向。我只需要把它放在窗口上就可以了。离窗口很近,但还没有提前触发。迪奥德斯:我没有展示它,因为它不会太有帮助。但是既然你问了,我会把它添加到原来的问题中。接下来,为什么不干脆放进一个窗口。在没有设置超时的情况下关闭?然而,这是行不通的。setTimeout必须在那里,但可以很短。我现在有200个,或者0.2秒,它工作得很好。也就是说,它允许该功能像过去一样在Chrome上工作,打印对话框只是无限期地等待用户输入,并且没有延迟关闭窗口。我不明白,但它是有效的。事实上,同样的代码也适用于其他浏览器,允许非常简化的最终形式。仅将setTimeout添加到原始代码中似乎就足以解决此问题。最终解决方案:使用以下方法代替原始body onload:调用window.print()时遇到类似问题,然后将location.href设置为新页面。打印窗口似乎从未出现过。这个答案解决了我的问题。非常感谢,伐木工人!要完全正确,必须将print()和close()放入settimeout函数中,如下所示:settimeout(函数(){window.print();window.close();},200);这种方法对我有效。@JeffreySimon你是对的,我也有同样的问题。。超时不需要太长,事实上,零(0)工作!当打印对话框处于活动状态时,似乎不可能在该对话框的父窗口上执行javascript。这真的很奇怪。。。但无论如何,谢谢你们所有人的解决方案!欢迎来到SO!当你发布了一个问题的回复,还有一些问题时,试着揭露你的好处。在这种情况下,有几个类似的。。。
   window.print();
   window.close();
   document.execCommand('print');
   window.close();