打开包含ASPX回发结果的弹出窗口

Ser*_*rge 7 javascript asp.net pdf-generation

我有一个ASPX页面,其中包含许多字段,当我单击"导出到PDF"按钮时,它会生成PDF文档.

我现在想在JavaScript中使用"print PDF"按钮来执行以下操作:

w = window.open(?);
w.print();
w.close();
Run Code Online (Sandbox Code Playgroud)

其中,"?"将执行相同的回发我的"导出为PDF"按钮.

小智 2

如果您需要将表单提交(回发)到新窗口,您可以尝试将表单目标更改为 fake,例如:

var form = $("form");
form.attr("target", "__foo");
Run Code Online (Sandbox Code Playgroud)

提交表格。

form.submit();
Run Code Online (Sandbox Code Playgroud)

并删除目标(setitmeout(,1) - 将事件放入js“事件队列”的末尾,在我们的例子中 - 在表单提交之后):

setTimeout(function () { form.removeAttr("target");  }, 1);
Run Code Online (Sandbox Code Playgroud)

另外,在提交之前,您可以尝试使用 __foo id 打开窗口以获得更多样式,并且表单将在此窗口中提交(回发),而不是新窗口:

 var wnd = window.open('', '__foo', 'width=450,height=300,status=yes,resizable=yes,scrollbars=yes');
Run Code Online (Sandbox Code Playgroud)

但我不知道如何处理提交的窗口并捕获 onload 或 jquery 的就绪事件。如果您能做到,请分享解决方法并调用 wnd.print(); 您可以在这个 wnd 中使用 iframe,也许您会找到解决方案。

更新:

尝试看看这个原型[在 Chrome 中测试]:

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.0.min.js"></script>
    <script type="text/javascript">
        function PrintResult() {
            var wnd, checker, debug;

            debug = true;

            // create popup window
            wnd = window.open('about:blank', '__foo', 'width=700,height=500,status=yes,resizable=yes,scrollbars=yes');

            // create "watermark" __loading.
            wnd.document.write("<h1 id='__loading'>Loading...</h1>");

            // submit form to popup window
            $("form").attr("target", "__foo");
            setTimeout(function() { $("form").removeAttr("target"); }, 1);

            if (debug)
            {
                $("#log").remove();
                $("body").append($("<div id='log'/>"));
            }

            // check for watermark
            checker =
                setInterval(function () {
                    if (debug) $("#log").append('. ');

                    try {
                        
                        if (wnd.closed) { clearInterval(checker); return; }

                        // if watermark is gone
                        if (wnd.document == undefined || wnd.document.getElementById("__loading") == undefined) {
                            if (debug) $("#log").append(' printing.');
                            //stop checker
                            clearInterval(checker);

                            // print the document
                            setTimeout(function() {
                                wnd.print();
                                wnd.close();
                            }, 100);
                        }
                    } catch (e) {
                        // ooops...
                        clearInterval(checker);
                        if (debug) $("#log").append(e);
                    }
                }, 10);
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button runat="server" ID="ReportButton" OnClick="ReportRenderClick" Text="Export to PDF" OnClientClick="PrintResult()"/>
        <asp:Button runat="server" Text="Just a button."/>
    </div>
    </form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

这是 .cs 文件:

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void ReportRenderClick(object sender, EventArgs e)
    {
        Response.Clear();
        Thread.Sleep(2000);
        Response.ContentType = "application/pdf";
        Response.WriteFile("d:\\1.pdf");

        //Response.ContentType = "image/jpeg";
        //Response.WriteFile("d:\\1.jpg");

        //Response.Write("Hello!");
        Response.End();
    }
}
Run Code Online (Sandbox Code Playgroud)