在开发Web应用程序时,经常会遇到需要执行耗时操作的情况。例如,当用户点击一个按钮以从服务器检索数据并绑定到ASP.NETGrid时,这个过程可能需要30秒才能显示结果。在此期间,用户可能会尝试点击页面上的其他选项,这可能会导致意外的行为和页面结果的异常。因此,当网页执行服务器端任务超过几秒钟时,显示一个“处理中”的消息是明智的。
虽然可以使用Ajax .NET控件(如“Modal Popup Extender”、模态窗口、iframe等)来实现更复杂的效果,但本文将介绍一种简单、轻量级的JavaScript解决方案,它不仅快速,而且不会干扰ASP.NET服务器端代码。这种方法同样适用于其他Web编程语言,如PHP、JSP、Cold Fusion等。
假设有一个ASPX页面,它在用户点击按钮时检索数据并绑定到ASP.NETGrid。这个过程需要30秒才能显示结果,在此期间,页面需要:
首先,在HTML代码中添加一个
<div id="ProcessingWindow" visible="false">
<img src="loading.gif" />
</div>
接下来,创建一个JavaScript函数ShowProcessMessage(),用于将
<script language="javascript" type="text/javascript">
function ShowProcessMessage(PanelName) {
document.getElementById(PanelName).style.visibility = "visible";
document.getElementById(PanelName).innerHTML = '处理中...请稍候... ';
DisableAllControls('btnLoad');
return true;
}
</script>
此外,还需要一个JavaScript函数DisableAllControls(),用于禁用除触发事件的控件(如按钮)和隐藏类型(ASP.NET事件处理程序和ViewState)之外的所有控件。
<script language="javascript" type="text/javascript">
function DisableAllControls(CtrlName) {
for (var i = 0; i < document.forms[0].elements.length - 1; i++) {
var elm = document.forms[0].elements[i];
if ((elm.name == CtrlName) || (elm.type == 'hidden')) {
elm.disabled = false;
} else {
elm.disabled = true;
}
}
}
</script>
最后,在按钮的OnClientClick事件中调用JavaScript函数。这样,页面控制首先触发客户端函数,然后转到服务器端事件处理程序。
<asp:Button ID="btnLoad" runat="server" onclick="btnLoad_Click" Text="获取歌曲列表" OnClientClick="ShowProcessMessage('ProcessingWindow')" />
在开发Web页面的复杂功能时,这是一个经常遇到的问题。希望这个解决方案对有所帮助。