我无法在任何地方找到答案,而且细节让我发疯。我的任务是更新旧的应用程序,只使用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();
数据是报表服务器返回的字节流。
唯一不起作用的是动画GIF即使在发布报告并且用户点击打开/保存/取消对话框后也会继续播放。我怀疑它是Response.End();调用,但即使消除行并让服务器继续运行也不能缓解这个问题。在收到报告数据后,该页面似乎没有执行任何回发,并且.html源显然显示了GIF。如果我手动回发,则会丢失打开/保存/取消对话框,用户无法显示内容。
我在这里不知所措,我已经在这几个小时了,任何帮助都表示赞赏。 谢谢你的到来。
答案 0 :(得分:1)
我假设您已经想到了另一个版本的相同GIF没有动画效果的想法,并在您希望动画停止时交换它?
根据您已有的代码,只需将.src设置为非动画版本即可。在这种情况下,您还可以获得已完成状态等的好处。
另外,如果您正在调用set timeout,最好将函数引用而不是代码作为字符串传递。这样你就不需要浏览器引擎来评估运行时的代码,这些代码更慢,更难调试,并获得更好的开发支持..
例如: setTimeout(animateGif,100);
function animateGif(){ document.images [ “动画”]。SRC = “图像/ loading.gif” } function stopAnimating(){ document.images [ “动画”]。SRC = “图像/ loaded.gif” }
答案 1 :(得分:0)
在服务器端使用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();
解决方案是:
Response
个对象分隔到另一个页面,例如 Report.aspx 。因此,您的 GenerateReport.aspx 不应包含任何Response
个对象。所有Response
个对象都在 Report.aspx 。在btnSubmit_Click
事件处理程序中,调用javascript代码打开 Report.aspx 的新窗口,如下所示:
//Some other codes
ClientScript.RegisterStartupScript(this.GetType(), "javascript", "window.open('../Report.aspx')", true);
在btnSubmit
控件上,您应OnClientClick
调用showDiv()
来显示加载图片。
通过将Response
对象转移到另一个页面, GenerateReport.aspx 将保留其回发,并且当您的加载图片的页面回发将消失。