我们的网站具有可以打印会员资料的功能。它的工作方式是通过onsubmit将javascript函数附加到按钮。 javascript函数使用window.open以特殊模式重新打开页面,重新显示页面的打印机友好版本。
此功能自2008年左右开始实施,适用于所有浏览器。除了大约一周前,它已停止在Chrome中工作。使用Chrome时,打开的窗口会打开,但随后会打开另一个空白窗口,然后关闭所有窗口。
在搜索此问题的讨论时,我无法找到确切的问题,但确实找到了一些内容,表示应该在onsubmit中添加“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():
/*
* called by view-profile.php
*/
function PrintEmailSubmit(mode)
{
var width;
var height;
switch(mode)
{
case 'print':
width = 850;
height = 1000;
break;
case 'email':
width = 400;
height = 120;
break;
default:
alert('Error: invalid calling sequence -- should not happen!');
exit;
}
window.open('print-email-profile.php?mode=' + mode,'','width=' + width + ',height=' + height + ',scrollbars=yes,location=0,menubar=1,status=0,toolbar=0');
}
最后,这项工作的原因是页面的特殊版本在body标签中添加了以下内容:
<body onload="window.print();window.close();">
如上所述,该功能继续在IE和Firefox中运行。只是Chrome有这个问题。
有什么想法吗?
答案 0 :(得分:6)
按钮和window.open实际上与你的问题无关。
问题是,Chrome在打印之前正在寻找用户输入。 Window.print()打开打印对话框窗口,但Chrome不等待您完成打印。 window.close()正在关闭打印对话框窗口以及父窗口中的所有其他内容。
为了节省您的时间,请注意Chrome根本不使用OnAfterPrint挂钩。我还尝试将window.close()放在onLead和onBeforeUnload中的window.print()中,但print对话框取消了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();">
我没有对此进行过测试,但我认为它能够相当有效地证明这一想法。
答案 1 :(得分:2)
我找到了这个解决方案,它确实有效:
<body onload="window.print();window.onmouseover = function() { self.close(); } ">
答案 2 :(得分:1)
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();
}
答案 3 :(得分:1)
我使用Mr.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();
}
答案 4 :(得分:0)
//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();">
这很好。
谢谢。
答案 5 :(得分:0)
这种方法我也遇到同样的问题
window.print();
window.close();
即使识别浏览器,然后相应地执行代码也很好。但这是一个非常方便且快捷的解决方案,只需两行即可解决此问题。
document.execCommand('print');
window.close();
在chrome
和IE
中工作得很好