【问题标题】:Chrome window.print() window.close() results in 'print preview failed'. Solution?Chrome window.print() window.close() 导致“打印预览失败”。解决方案?
【发布时间】:2011-10-04 19:22:26
【问题描述】:

我有一个在新选项卡或窗口中打开的打印页面。结果页面打开一个打印对话框。用户在打印对话框上进行选择后,页面将关闭选项卡/窗口。

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

这曾经在主流浏览器中运行良好,但最新版本的 Chrome 之一打破了这一点(即 14.0.835.202)。

我从 chrome 打印插件收到以下消息:“打印预览失败”。

有没有人可以在打印后关闭 Chrome 选项卡/窗口?

【问题讨论】:

  • 我也会尝试使用你从window.open得到的处理程序

标签: javascript google-chrome


【解决方案1】:

我只是想出了一个适合我的解决方案。我从秘鲁的回复开始,但不想在这个解决方案中使用 jQuery。

window.onload = function () {
  window.print();
  setTimeout(function(){window.close();}, 1);
}

由于某种原因,Chrome 在打印对话框关闭之前不会启动超时计时器。

【讨论】:

  • 这在 IE、Chrome 和 Firefox 上对我有用。我没有在任何其他浏览器上进行测试。
  • 但是当我在打印预览对话框之前按 ctrl+P 时。标签即将关闭。有什么解决办法
【解决方案2】:

这个问题是 Google 上的热门问题,所以我想我会添加我发现的内容,即使它并不完全反映您的情况。如果您有一个调用 window.print() 的链接,那么它的 onclick 处理程序必须返回 false,否则您会收到错误消息。即使链接是哈希并且无处可去也是如此!

打印不可用,因为您尝试打印的页面已关闭

要解决此问题,请确保将 return false 添加到链接。

<a href="#" onclick="window.print(); return false;" >Print</a>

这是解决此问题的 Chromium 错误。它在 Chrome 17 中被标记为已修复(尚未发布),我已经在 Chrome 18 中验证了该修复。

http://code.google.com/p/chromium/issues/detail?id=92107

【讨论】:

    【解决方案3】:

    我认为没有任何标准化的打印事件。 IE has a couple,但我知道这对 Chrome 没有帮助。

    我认为您可能只有两个选择。手动关闭按钮或使用setTimeout 的某种形式的延迟。

    【讨论】:

    • 我之前有:window.print(); setTimeout('window.close()', 1000);这曾经适用于 Chrome,但在最新版本中停止工作。 Chrome 报告:“打印不可用,因为您尝试打印的页面已关闭。”如果有人质疑关闭按钮是唯一的选择,请告诉我!谢谢!
    【解决方案4】:

    类似的问题,我有。

    仅供 17 版以上的所有人使用 我正在使用 jquery 插件 printElement 并找到了一种编辑它的方法,因此我可以关闭窗口,即使在 chrome 中也是如此......然后他们更新了这个新的打印内容! 我又有办法了。

    上一个

    Chrome used to open a seperate window containing just the element i wanted 
    printed and its relative css.  That window then spawned the .print command 
    which opened another window containing print preview. By adding a simple 50 
    millisecond timeout i was able to close the previous window without hurting 
    the print preview.
    

    新问题

    Chrome no longer opens a new window for their print preview. Instead it 
    opens a "dialog with overlay" in the current page to be printed (aka, our 
    new blank page containing just the element for print). Thus, when my timer 
    kicked in, it wouldn't close the page immediately, but as soon as the dialog 
    code closed.  The problem was, it closed so fast, the print command never 
    made it to its service and thus nothing was printed to pdf 
    (what our clinic uses).
    

    新的解决方案

    我知道增加计时器无济于事,因为它只会在最后关闭并且仍然可以停止打印对话框。相反,我将一个指向最新 jquery 构建的脚本链接添加到新的 about 页面的标题中,然后将悬停添加到要打印的页面的正文中。悬停时...关闭!!!你猜怎么着......它的工作原理很完美!!!

    总的来说,如果您使用空白页面在 chrome 中打印并且需要在打印元素/任何内容后关闭页面,只需在该页面的正文(或内部 html)上添加一个悬停事件关闭窗口。然后,当您选择打印方法并点击打印时,它将打印并关闭对话框,留下那个烦人的窗口。只需将鼠标移动一下,VIOLA 就可以了!烦人的弹出窗口消失了!

    【讨论】:

    • 这是我发现的唯一有效的解决方案。向您致敬,先生。
    【解决方案5】:

    以上所有解决方案都没有解决我的问题,使用此代码解决了我的问题

    setTimeout(function () {
            mywindow.print();
            mywindow.close();
        }, 1000); 
    

    【讨论】:

      【解决方案6】:

      将此脚本添加到您的弹出打印窗口

      <script src="/assets/print_window_close.js" type="text/javascript"></script>
      

      print_window_close.js 的内容是

      jQuery(document).ready(function() {
      
          setTimeout(function() {
              window.close();
          }, 1);
      
      });
      

      基本上 seTimeout 仅在文档​​获得焦点时调用,这仅在覆盖打印对话框关闭时发生。因此,它的工作方式与您想要的完全相同。

      【讨论】:

        【解决方案7】:

        对我来说,我找不到解决方案,所以我创建了一个。

        我所做的是创建一个不可见的文本框,并在 window.print() 被调用后每 50 毫秒使用一次 setInterval 来关注它。我还将 onfocus 事件绑定到文本框,当它被触发时我关闭窗口。这是在 Chrome、Firefox 和 Internet Explorer 上测试的。

        window.print();
        setInterval(function () {
          document.getElementById("focustext").focus();
        }, 50);
        document.getElementById("focustext").onfocus = function () { window.close(); }
        #focustext {
          border: none;
          height: 0px;
          width: 0px;
        }
        &lt;input id="focustext" type="text" /&gt;

        【讨论】:

          【解决方案8】:

          我目前的黑客。基本上,就在 window.print() 之后,我绑定了 mousemove、click 和 keypress 以触发我想要的操作(window.close(); 或 window.location.href=somewhere;)。只要用户什么都不做,该操作就不会发生。但它工作得很好。 (好吧,我至少可以忍受直到错误得到纠正)

          /* 
          // alternative to window.print() for dedicated print windows (had issue with <body onload=window.print()...
          // not used anymore.
          $('<a id="aprint" href="#" onclick="return window.print()" class="invisible"></a>').appendTo('body');
          $('#aprint').trigger('click');
          */
          $('body, select, input, textarea, button, submit, form').prop('disabled', true);
          window.print();
          setTimeout(function() {
              $('body').bind('mousemove click keypress', function () {
                  window.location.href=home;                      
              });
          }, 200);    
          

          【讨论】:

            【解决方案9】:

            我的解决方案:

            window.print();
            if(/Chrome/.test(navigator.userAgent)){
              $(window).focus(function(){
                window.location = '/print-thank-you';
              });
            } else {
              window.location = '/print-thank-you';
            }
            

            编辑:在 Chrome 版本 >= 17 上打印的工作方式与 IE/FF 一样,因此请确保您也考虑到这一点

            【讨论】:

              【解决方案10】:

              经过一下午的研究并感谢@SpYk3HH 的回答,我找到了一个适用于我当前运行的版本的解决方案:

              IE : 9.0.8...

              火狐:15.01

              铬:23.0.1271.97 米

              Safari:5.1.7

              在准备要在打印特定页面上显示的 html 时,包括检查

              if (oWindow == null || oWindow.closed || typeof(oWindow) == "undefined")
              

              然后通知用户临时启用弹出窗口。为了让您的页面能够打开,显示打印对话框并在打印对话框关闭时关闭,将此函数添加到窗口主体的 onload 函数中:

              function PrintPage()
              {
                  self.print();
                  self.onmouseover = (function() { window.close(); }
              }
              

              之所以可行,是因为从根本上说,我们仍在处理对象和事件。浏览器在某些方面可能表现不同,但它们都有共同点。当窗口获得焦点时,希望总是会发生一个简单的 onmouseover 事件,因此希望这段代码不会失去其相关性。

              【讨论】:

                【解决方案11】:

                对我来说很好用……

                var newWin = window.open('', '');
                //htmlPage is your html content 
                setTimeout(newWin.document.write(htmlPage),1000);
                // newWin.document.body.innerHTML = htmlPage;
                newWin.document.close();
                newWin.focus();
                setTimeout(newWin.print(), 10000);
                newWin.document.close();
                newWin.close();
                return false;
                

                【讨论】:

                  【解决方案12】:

                  今天测试适用于 IE、FF、Chrome (including preview fix for chrome)

                      setTimeout(function () { window.print(); }, 500);
                      window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
                  

                  【讨论】:

                    【解决方案13】:

                    现在我们有了这个事件:WindowEventHandlers.onafterprint (https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onafterprint)。

                    通过此活动,您可以执行以下操作:

                    window.onafterprint = function() { 
                        window.close();
                    };
                    window.print();
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-12-08
                      • 2015-09-23
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多