【问题标题】:Print function in Chrome no longer workingChrome 中的打印功能不再起作用
【发布时间】:2013-08-14 18:55:38
【问题描述】:

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

此功能自 2008 年左右开始使用,适用于所有浏览器。除了大约一周前,它已停止在 Chrome 中工作。在 Chrome 中,打开的窗口确实打开了,但随后又短暂打开了另一个空白窗口,然后所有窗口都关闭了。

在搜索有关此问题的讨论时,我无法找到确切的问题,但确实找到了一些说“返回 false”应该添加到 onsubmit 的内容。我尝试添加它,但没有帮助。

这是 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 有这个问题。

有什么想法吗?

【问题讨论】:

  • 会不会是 Chrome 的弹出窗口阻止程序阻止了它?那么你应该会收到通知,控制台是否显示任何错误?
  • 如果不是太长,请附上PrintEmailSubmit的JS
  • 没有window.close也能用吗?如果是,则设置关闭窗口的超时时间或改用按钮。
  • Badr Hari:奇怪的是,它在所有浏览器中都可以正常运行 6 年,但现在无法在 Chrome 上运行。实际上,从主体 onload 中取出 window.close 确实允许打印功能在 Chrome 上工作,但它会使打印友好的窗口保持打开状态。因此,这指向了解决方案的方向。我只需要让 window.close 在那里,但不会过早触发
  • Diodeus:我没有展示它,因为它不会太有帮助。但是既然你问了,我会把它添加到原来的问题中。

标签: javascript google-chrome window.open


【解决方案1】:

button和window.open真的和你的问题无关。

问题是,Chrome 会在打印之前寻找用户输入。 Window.print() 会打开打印对话窗口,但 Chrome 不会等待您完成打印。 window.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();">

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

【讨论】:

  • 接下来,为什么不直接放一个没有setTimeout的window.close呢?但是,这是行不通的。 setTimeout 必须在那里,但可以很短。我现在有 200 个,或者 0.2 秒,它工作正常。也就是说,它允许该功能像过去一样在 Chrome 上工作,打印对话框只是无限期地等待用户输入,并且没有延迟关闭窗口。我不明白,但它有效。事实上,相同的代码也适用于其他浏览器,允许非常简化的最终形式。只需将 setTimeout 添加到原始代码中似乎就足以解决问题。
  • 最终解决方案:使用以下内容代替原始正文 onload:
  • 我在调用 window.print() 然后将 location.href 设置为新页面时遇到了类似的问题。打印窗口从未出现(似乎)。这个答案解决了我的问题。非常感谢,伐木工人!
  • 要完全正确,您必须将 print() 和 close() 都放入 settimeout 函数中,如下所示: setTimeout(function(){window.print(); window.close();} , 200);这种方式对我有用。
  • @JeffreySimon 你是对的,我也有同样的问题.. 超时不需要很长,事实上零(0)工作!似乎在打印对话框处于活动状态时,不可能在该对话框的父窗口上执行 javascript。这真的很奇怪......但无论如何感谢大家的解决方案!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我使用 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】:

      Chrome 速度如此之快,以至于它实际上在加载文档之前调用了 print。这就是为什么最好的办法就是将打印功能移至 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();
      }
      

      【讨论】:

        【解决方案5】:
        //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();">
        

        这很好用。

        谢谢。

        【讨论】:

          【解决方案6】:

          我也遇到了同样的问题

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

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

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

          chromeIE 中工作得很好

          【讨论】:

          • 欢迎来到 SO!当您发布对问题的回复并且还有更多问题时,请尝试展示您的好处。在这种情况下,有几个类似的......
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-23
          • 1970-01-01
          • 2020-08-24
          相关资源
          最近更新 更多