Chrome中的打印功能不再工作

mec1mxoz  于 2023-08-01  发布在  Go
关注(0)|答案(6)|浏览(212)

我们的网站有一个功能,即可以打印会员资料。它的工作方式是通过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遇到了这个问题。
有什么想法吗

dzjeubhm

dzjeubhm1#

按钮和window.open与您的问题无关。
问题是,Chrome在打印之前会寻找用户输入。print()打开打印对话框窗口,但Chrome不会等待您完成打印。close()关闭打印对话框窗口和父窗口中的所有其他内容。
为了保存您的时间,请注意,Chrome根本不使用OnAfterPrint钩子。我还尝试将window.close()放在onLoad中,将window.print()放在onBeforeUnload中,但打印对话框取消了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();">

字符串
我还没有测试过这个,但我认为它相当有效地证明了这个想法。

qf9go6mv

qf9go6mv2#

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

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

字符串

db2dz4w8

db2dz4w83#

我使用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();
}

字符串

vkc1a9a2

vkc1a9a24#

Chrome的速度非常快,以至于它实际上在加载文档之前就调用了打印。这就是为什么最好的方法是将print函数移动到onload,就像Mari或这样:

winPrint = window.open("", "winPrint", "width=1,height=1");
winPrint.document.write(html);
winPrint.onload = function () {
    window.print();
    window.close();
};

字符串
而且它在IE中不工作,所以完整的代码应该是这样的

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

mitkmikd

mitkmikd5#

//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();">

字符串
这个很好用。
谢谢

ruoxqz4g

ruoxqz4g6#

我也得到了同样的问题与此方法

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

字符串
甚至识别浏览器并随后相应地执行代码也是好的。但这是一个非常方便和快捷的解决方案,以解决这个问题,只有两行。

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


chromeIE中运行良好

相关问题