【问题标题】:How to stop animated GIF once report data is returned?返回报表数据后如何停止动画 GIF?
【发布时间】:2010-06-01 14:03:50
【问题描述】:

我在任何地方都找不到答案,这些细节让我发疯。我的任务是更新旧的应用程序,只使用 JavaScript 来处理客户端 UI 的东西。过去使用 PDF 模板生成报告并手动循环遍历数据集,基本上是填写表格,然后显示报告。这使服务器崩溃了很多很多次。

我已经更新了应用程序以使用报表服务器,以帮助使报表生成负载脱机。一切正常,除了报告返回后动画 GIF 不会停止。我用:

<span id="hiddenImg" style="display: none">
<img src="" id="animate" align="middle" alt="Loading"/>
</span>

连同以下 JavaScript:

function showDiv() 
  {
     document.getElementById('hiddenImg').style.display ="";  
     setTimeout('document.images["animate"].src="images/loading.gif"',100); 
  } 

效果很好。在服务器端,我有这样的事情:

Response.AddHeader("Content-Type", "application/" + format);
Response.AddHeader("Content-Disposition", "attachment;filename=" + "report." + format);
data = report.GetBytes(reportpath, rbFormat.SelectedValue);    
Response.BinaryWrite(data);
Response.End();

data 是报表服务器返回的字节流。

唯一不起作用的是,即使在报告交付并且用户单击打开/保存/取消对话框后,动画 GIF 仍将继续播放。我怀疑是Response.End(); 调用,但即使消除线路并让服务器继续运行也不能缓解这个问题。在收到报告数据后,页面似乎没有执行任何回发,并且 .html 源显然显示的是 GIF。如果我手动回发,我会丢失打开/保存/取消对话框,并且用户没有机会显示内容。

我在这里不知所措,我已经在这几个小时了,感谢任何帮助。

【问题讨论】:

标签: javascript asp.net reporting-services dom-events


【解决方案1】:

我假设您已经考虑过使用另一个没有动画的相同 GIF 版本,并在您希望动画停止时交换它?

考虑到您已经拥有的代码,这不会花时间,只需将 .src 设置为非动画版本。在这种情况下,您还可以获得完成状态等的好处。

另外,如果您调用设置超时,最好传递函数引用而不是代码作为字符串。这样你就不需要浏览器引擎在运行时评估代码,这会更慢、更难调试,并获得更好的开发支持..

例如: setTimeout(animateGif, 100);

函数 animateGif() { document.images["animate"].src="images/loading.gif" } 函数停止动画(){ document.images["animate"].src="images/loaded.gif" }

【讨论】:

    【解决方案2】:

    在服务器端使用Response 对象时,IE 会以某种方式取消回发。这是一种奇怪的行为。

    假设您的 GenerateReport.aspx 具有 btnSubmit 控件和 btnSubmit_Click 事件处理程序。在处理程序中你有你的代码:

        //Some other codes
        Response.AddHeader("Content-Type", "application/" + format);
        Response.AddHeader("Content-Disposition", "attachment;filename=" + "report." + format);
        data = report.GetBytes(reportpath, rbFormat.SelectedValue);    
        Response.BinaryWrite(data);
        Response.End();
    

    解决办法是:

    1. Response 对象分离到另一个页面,例如Report.aspx。所以你的 GenerateReport.aspx 不应该有任何 Response 对象。所有Response 对象都在Report.aspx中。
    2. btnSubmit_Click事件处理程序上,调用javascript代码打开新窗口到Report.aspx,像这样:

      //Some other codes
      ClientScript.RegisterStartupScript(this.GetType(), "javascript", "window.open('../Report.aspx')", true);
      
    3. 在您的btnSubmit 控件上,您应该有OnClientClick,它调用showDiv() 来显示加载图像。

    通过将Response 对象转移到另一个页面,GenerateReport.aspx 将保留其回发,并且当页面回发时,您的加载图像将消失。

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 2021-07-21
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      相关资源
      最近更新 更多