我有一个页面在page_load方法中执行长时间运行的任务(10到15秒)。
我有客户端的javascript代码,会向用户显示一个体面的“页面加载”动画gif。
我能够从代码隐藏中调用JavaScript方法,以显示“页面加载”动画gif,但是,长时间运行的任务正在挂起UI,使得动画gif实际上不会显示,直到在长时间运行的任务完成之后,这与我想要的完全相反。
为了测试这一点,在我的page_load方法中,我调用JavaScript方法来显示动画gif。然后,我使用Thread.Sleep(10000)。发生的事情是,直到Thread.Sleep完成后才会显示动画gif。
显然我做错了。
任何建议都将受到赞赏。
感谢。
克里斯
以下是代码隐藏的示例:
protected void Page_Load(object sender, EventArgs e)
{
ClientScript.RegisterStartupScript
(GetType(), "Javascript", "javascript: ShowWaitIndicator(); ", true);
Response.Flush();
Thread.Sleep(10000);
}
答案 0 :(得分:4)
我通过在页面上放置一个计时器来完成此操作。在第一次打勾后,禁用它并运行您的任务。
<asp:Timer runat="server" id="UpdateTimer" interval="500" ontick="UpdateTimer_Tick" />
我把它放在UpdatePanel中以满足我的需求。我不确定哪种方法最适合你。然后在你的代码后面......
Protected Sub UpdateTimer_Tick(ByVal sender As Object, ByVal e As EventArgs)
UpdateTimer.Enabled = False
' run method here
End Sub
答案 1 :(得分:4)
原因是Page.Load事件在任何响应发送到客户端之前触发;因此,在客户端收到响应之前,不会发生客户端的任何指示(例如执行javascript)。
所以......在Page.Load中放置长时间运行的任务将无法获得您想要的效果。这听起来像是使用AJAX或其他形式的异步数据检索的情况。在这种情况下,您返回到客户端的页面不会包含您长时间运行的任务的结果 - 因此页面本身(使用它的微调器)快速加载,然后客户端请求数据;当数据准备就绪(10-15秒后),您可以使用结果更新客户端中的DOM。
答案 2 :(得分:4)
以下示例适合您。只是放在页面加载事件中。
Response.Write("<div id=\"loading\" style=\"position:absolute; width:100%; text-align:center; top:300px;\"><img src=\"http://www.cse.iitk.ac.in/users/singhroh/images/loading.gif\" border=0></div>");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("script>document.getElementById('loading').style.display='none';</script>");
答案 3 :(得分:1)
我会避免从代码隐藏中调用你的JavaScript。
相反,使用jQuery库。您可以使用以下代码在加载DOM后立即触发代码:
$(document).ready(function() {
//Call your JavaScript method here.
});
您还需要将jQuery添加到您的页面,这是Microsoft CDN中包含的单个脚本。将其添加到您的标记中即可:
<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js"></script>
这将在页面加载时立即调用您的GIF JavaScript方法,您可以消除Thread.Sleep。我假设您的动画GIF方法会在10-15秒后自动隐藏图像。
答案 4 :(得分:1)
从旧学校开始,你可以关闭缓冲。启用缓冲(默认设置)后,页面会在发送到客户端之前以其完整性生成。如果您关闭缓冲,它会在加载时发送,因此您可以发送html来切换加载图形,执行长时间运行的任务,然后发送一些javascript来关闭它。
答案 5 :(得分:0)
听起来像是在ASP onload进程之后显示Javascript onload。您可能希望将时间密集型操作延迟到Page.LoadComplete - 这样,您的用户将在密集操作发生之前看到Javascript渲染。
然后,您将在函数完成后根据需要更新页面内容。
您能提供代码示例吗?