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