【问题标题】:Resetting wait cursor in browser with Content-Disposition:attachment使用 Content-Disposition:attachment 在浏览器中重置等待光标
【发布时间】:2011-01-01 21:39:48
【问题描述】:

以下代码运行良好:

<script type="text/javascript">
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_initializeRequest(InitializeRequest);
    prm.add_endRequest(EndRequest);

    function InitializeRequest(sender, args) {
        document.body.style.cursor = 'progress';
    }
    function EndRequest(sender, args) {
        document.body.style.cursor = 'default';
    }
</script>

当响应返回附件时(例如,来自 ReportViewer 控件的 PDF):

Response.AddHeader("Content-Disposition", "attachment; filename=some.pdf")

EndRequest() 永远不会触发,并且“进度”光标不会重置。 Javascript 调用,例如

ScriptManager.RegisterStartupScript(this, this.GetType(), "close", 
   "parent.EndRequest(...);", true);

可以解决问题,但由于内容配置的原因,这是不可能的。 你能想出一种正确的方法——在呈现 PDF 时显示等待光标,并在显示 PDF 时返回正常光标?我在这里假设一个 C# 上下文,但问题不是特定于语言或平台的。

【问题讨论】:

    标签: javascript content-disposition mouse-cursor


    【解决方案1】:

    问题似乎是 EndRequest 函数没有被触发。您是否尝试查看 pageLoading 和 pageLoaded 事件是否正在触发?

    我感觉这些事件没有触发,因为没有任何内容发送回页面(附件没有像内联文档那样到达页面)。

    我会将文件下载移动到 iframe 中。以下是如何做到这一点的示例:

    function InitializeRequest(sender, args) {
        document.body.style.cursor = 'progress';
    
        var iframe = document.createElement("iframe");
        iframe.src = 'your pdf file';
        iframe.style.display = "none";
        document.body.appendChild(iframe); 
    }
    

    然后就可以访问iframe的onload事件了。

    编辑:

    进一步搜索将我带到this page。它似乎可以完成您想做的所有事情。

    【讨论】:

    • pageLoaded 也不会被触发,这在某种程度上是有道理的,因为响应并没有真正返回到浏览器的页面上下文。没有加载任何内容来替换当前页面。
    • 查看修改后的答案。包括更多细节。
    • 很高兴我们找到了解决方案。祝你项目的其余部分好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2010-12-15
    • 2010-11-24
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多