页面加载时的加载消息






4.87/5 (44投票s)
当 page_load 中的函数需要很长时间时,
引言
很多时候,Web 开发者会遇到在 Page_Load 事件中需要执行大量耗时操作的情况,而我们显然不希望最终用户看到一个纯白色的屏幕。一个“正在加载..”的消息或加载 GIF 会更友好。本文介绍了如何显示这样的消息。
Using the Code
完整的示例网站可以从 这里 下载。
使用 .Net IDE 打开网站:打开->网站->文件系统->(下载并解压缩的文件夹)。
代码
加载消息可以通过两种不同的方式显示。让我们看看这两种方式。
方法 1
这里目标页面不是直接调用的。而是调用一个包含加载消息的 HTML 页面,该页面会立即调用目标页面(通过 JavaScript)。
单击按钮时,将调用一个 JavaScript 函数,该函数会将用户重定向到“加载”HTML 页面。
<input id="btnLoad" type="button" value="Load Page" onclick="LoadPage()" />
JavaScript 函数
<script type="text/javascript">
function LoadPage()
{
    var loadPageURL = '\Loading.html'; //Intermediate page with "Loading" message 
    window.location = loadPageURL;
    return false;
} 
</script> 
在“加载”页面的 body 中,我们添加一个在页面加载时调用的函数。
页面内容只包含一个 GIF 图像。添加您想向用户提供的任何信息。
 <body onload="Redirect()"> 
页面加载时,将调用此 JavaScript,它会立即重定向到实际页面。但是,此页面的内容将在其他页面完全加载之前显示在浏览器中。
<script type="text/javascript">
function Redirect()
{
  window.location = '\SlowPage.aspx'; // Redirect immediately to the actual page
}
</script>
方法 2
第二种方法稍微复杂一些。我们不使用重定向。这里使用的技术是将 page_load 期间执行的操作移动到 button_click 事件(隐藏按钮的事件),并且页面加载不包含任何内容。因此,页面加载速度很快。页面 HTML 内容中放置了一个加载消息,显示出来。然后,使用延迟的 JavaScript 调用,我们触发一个回发(按钮单击事件)。在那里,我们将执行所有实际打算在 page_load 中执行的操作。
在页面加载时,我们调用一个 JavaScript 函数。
<body onload="PageLoad()"> 
被调用的 JavaScript 函数会触发延迟的按钮单击事件(使用 setTimeout)。
<script type="text/javascript">
var _isInitialLoad = true;
function PageLoad()
{
  if(_isInitialLoad)
  {
    //Check to make sure the page load doesn't gets called over and over
    if (document.getElementById('hdnLoaded').value)  
    {
       _isInitialLoad = false;
       
       //Triggering a postback after 100 milliseconds 
       setTimeout('__doPostBack(\'<%= this.btnPageLoad.ClientID % > \' , \' \' );' ,100);
    }
  }
}
</script> 
隐藏按钮,在其单击事件中执行所有页面加载事件,以及隐藏文本框,用于告诉我们页面加载操作是否完成。
<asp:Button ID="btnPageLoad" runat="server" Text="Page Load" 
	OnClick="btnPageLoad_Click"
 Style="display: none" UseSubmitBehavior="false" /> 
<input type="hidden" id="hdnLoaded" runat="server"/>
“正在加载”消息。(分组在 div 标签中。)
<div id="divLoading" runat="server" style="text-align: center">
   <br /><br /><br /><br /> 
   <span style="font-size: 10pt; font-family: Verdana">
                [Please wait while the page is loading...]
   </span>
   <br />
   <img src="Images/ajax-loader.gif" alt="Loading..." /><br />
</div>
服务器端代码如下所示。所有页面加载操作(或至少是耗时且独立的的操作)都移动到按钮单击事件。
protected void btnPageLoad_Click(object sender, EventArgs e)
{
  //Some operation that takes long time
  //Setting a hidden variable will help avoiding a loop of 
  //postback triggered from client side script.
  hdnLoaded.Value = "true";
  divLoading.Visible = false; // Make the loading message invisible
}
就这样。我花了一段时间才找到我需要这种东西的帮助。所以这里有一个给其他人。希望这能帮助到某人。
这是我在 The Code Project 上的第一篇文章。欢迎提出任何改进意见。
历史
- 2009 年 2 月 24 日:初始发布


