【问题标题】:Print window blocked by browser popup blocker浏览器弹出窗口阻止程序阻止了打印窗口
【发布时间】:2015-05-05 15:49:07
【问题描述】:

我正在尝试显示一个打印对话框,用户可以在其中通过按钮控件打印出发票。这段代码的主要部分是 javascript,但我注意到当我点击打印按钮时,(在 4 台不同的电脑上)谷歌浏览器中的弹出窗口阻止程序完全阻止了打印页面。在我允许弹出窗口之后,它工作得很好,但是客户不得不不断地说允许弹出窗口是不方便的。我查找了另一个选项,其中据称 window.createPopup 绕过了浏览器弹出窗口阻止程序,但使用了窗口限制。我也不认为 window.createPopup 是 asp.net 中的一种方法。当我们网站的任何客户因为我无法控制他们的浏览器设置而去打印页面时,如何防止弹出窗口阻止程序阻止打印页面对话框?有可能吗?

<script type="text/javascript">
   function PrintGridData() {
       var prtGrid = document.getElementById('<%=panel22.ClientID %>');
       prtGrid.border = 0;
       var prtwin = window.open('', 'Printpanel22Data', 'left=100,top=100,width=1000,height=1000,tollbar=0,scrollbars=1, status=0,resizable=1');
       prtwin.document.write(prtGrid.outerHTML);
       prtwin.document.close();
       prtwin.focus();
       prtwin.print();
       prtwin.close();       
   }
    </script>

以及调用函数的代码

Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
    ClientScript.RegisterStartupScript(Me.[GetType](), "PrintOperation", "PrintGridData()", True)
End Sub

【问题讨论】:

  • 您的浏览器设置为阻止弹出窗口。将其添加到受信任的站点。或者不要使用弹出窗口,而是使用 CSS 打印媒体来打印您需要的内容。
  • 我在问是否有任何方法可以绕过它,因为每个从我们网站购买商品的客户都可以选择打印他们的发票。所以我想尽量避免弹出窗口阻止程序,因为我无法控制客户浏览器
  • 您可以检测弹出窗口是否被阻止,但最好使用 CSS Print Media。就像添加新样式表并隐藏您不想打印的内容一样简单。
  • 是否有办法在用户使用 CSS 打印媒体时单击按钮时仍显示打印预览或至少向用户显示打印选项?
  • 当你触发 window.print() 时应该会出现。

标签: javascript asp.net vb.net popupwindow


【解决方案1】:

你可以使用

function PrintDiv() {
            var contents = document.getElementById("dvContents").innerHTML;
            var frame1 = document.createElement('iframe');
            frame1.name = "frame1";
            frame1.style.position = "absolute";
            frame1.style.top = "-1000000px";
            document.body.appendChild(frame1);
            var frameDoc = frame1.contentWindow ? frame1.contentWindow : frame1.contentDocument.document ? frame1.contentDocument.document : frame1.contentDocument;
            frameDoc.document.open();
            frameDoc.document.write('<html><head><title>DIV Contents</title>');
            frameDoc.document.write('</head><body>');
            frameDoc.document.write(contents);
            frameDoc.document.write('</body></html>');
            frameDoc.document.close();
            setTimeout(function () {
                window.frames["frame1"].focus();
                window.frames["frame1"].print();
                document.body.removeChild(frame1);
            }, 500);
            return false;
        }

【讨论】:

    【解决方案2】:

    很久以前,我不得不处理这样的事情。我最终放弃了要打印的弹出窗口,只是在我的 CSS 文件中使用了打印样式。是的,还有很多工作要做,而且你会用很多纸来测试它,但我必须迎合讨厌弹出窗口的用户。

    据我所知,弹出窗口的唯一其他方法是锚标记中的 target="_blank"...

    【讨论】:

    • 在我研究这个之前,使用 CSS 打印样式是如何工作的?您是否在单击按钮时调用 .css 文件?
    • 您在我们的样式表中添加一个@media print { } 指令(或者如果需要,将其设置为单独的样式表文件)并在其中应用您的样式。您可以在不打印的情况下在打印预览中查看它。它仅在打印操作期间应用,因此您的显示样式不会受到影响。
    • 所以我需要以某种方式调用一个打印函数来调用这个@media print{}?我如何从我的按钮点击进入打印屏幕
    • Javascript 有一个 Print 方法 - 或者用户可以点击 FIle -> Print 或 CTRL+P (但是他们启动打印操作并不重要 - 完成后会自动应用样式)你不不必担心这一点,您可以从浏览器中免费获得它。
    • 好的,感谢您的帮助,我将尝试一下,看看是否可以让它工作。
    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多