WEB应用程序中的进度条(第一次翻译,欢迎指正)

legend-never-die 2004-04-02 03:42:54
WEB应用程序中的进度条
Julien Cheyssial 写作于2003/10/01
Joise.LI翻译并修改于2004-4-2

写在前面:
原文是我在需要使用进度条时找到的一篇文章,讲解详细并附有实例。我在原文的基础上加上了自己的修改:增加了线程处理并且将进度条的使用放到了子线程中处理。这是我第一次翻译文章,敬请各位指正。原文见于http://www.myblogroll.com/Articles/progressbar/,请对照参考。
另外,参考了 Benjamin Tan的网站的CSS定义,在此表示感谢。


谁说在WEB应用程序中不能使用进度条?我认为能。本文将介绍在服务端长时间的处理过程中通过使用进度条提高WEB应用程序的质量和界面友好度。事实上,如果一个WEB应用程序一直运行在无状态和无连接状态下,用户很容易认为事情已经结束了。但是本文介绍的不使用任何ActiveX控件和乱七八糟的Java Applets的进度条将有助于改善这点。

在一个WEB应用程序中能够使用进度条的关键是浏览器有能力在所有页面加载完之前显示页面。我们将使用这点特性来有步骤的生成并且发送页面给客户端。首先,我们将使用HTML生成一个完美并且漂亮的进度条,然后我们动态的发送Javascript块以更新进度条。当然,以上的所有内容都是在断开用户请求之前实现的。在C#中,Response.Write允许我们加入自定义内容到缓存区并且Response.Fluse()允许我们把所有缓存区中的内容发送到用户的浏览器上。

第一步:
第一步让我们来建立一个进度条页面,我们使用progressbar.aspx。如上所述,我们逐步生成并发送页面到客户端。首先,我们将使用HTML生成一个完美并且漂亮的进度条。所需要的HTML代码我们可以从事先定义的progressbar.htm中获取,所以,第一件事情是装载它并且将数据流发送到客户端的浏览器,在progressbar.aspx的Page_Load中加入如下几行:
string strFileName = Path.Combine( Server.MapPath("./include"), "progressbar.htm" );
StreamReader sr = new StreamReader( strFileName, System.Text.Encoding.Default );
string strHtml = sr.ReadToEnd();
Response.Write( strHtml );
sr.Close();
Response.Flush();
以下是progressbar.htm的HTML代码,(译注:作者把脚本函数放在了另外一个js文件中,但我嫌麻烦就也放在了这个静态页面中了)
<script language="javascript">
function setPgb(pgbID, pgbValue)
{
if ( pgbValue <= 100 )
{
if (lblObj = document.getElementById(pgbID+'_label'))
{
lblObj.innerHTML = pgbValue + '%'; // change the label value
}

if ( pgbObj = document.getElementById(pgbID) )
{
var divChild = pgbObj.children[0];
pgbObj.children[0].style.width = pgbValue + "%";
}
window.status = "数据读取" + pgbValue + "%,请稍候...";
}

if ( pgbValue == 100 )
window.status = "数据读取已经完成";

}
</script>
<html>
<head>
<link rel="stylesheet" type="text/css" href="style/common.css" />
</head>
<body bgColor="buttonface" topmargin="0" leftmargin="0">
<table width="100%" height="100%" ID="Table1">
<tr>
<td align="center" valign="middle">
<DIV class="bi-loading-status" id="proBar" style="DISPLAY: ; LEFT: 425px; TOP: 278px">
<DIV class="text" id="pgbMain_label" align="left"></DIV>
<DIV class="progress-bar" id="pgbMain" align="left">
<DIV STYLE="WIDTH:10%"></DIV>
</DIV>
</DIV>
</td>
</tr>
</table>
</body>
</html>
对应的CSS定义如下:
.bi-loading-status {
/*position: absolute;*/
width: 150px;
padding: 1px;
overflow: hidden;
}

.bi-loading-status .text {
white-space: nowrap;
overflow: hidden;
width: 100%;
text-overflow: ellipsis;
padding: 1px;
}

.bi-loading-status .progress-bar {
border: 1px solid ThreeDShadow;
background: window;
height: 10px;
width: 100%;
padding: 1px;
overflow: hidden;

}

.bi-loading-status .progress-bar div {
background: Highlight;
overflow: hidden;
height: 100%;
filter: Alpha(Opacity=0, FinishOpacity=100, Style=1, StartX=0, StartY=0, FinishX=100, FinishY=0);
}
第二步:
现在我们可以开始更新进度条了,这是十分重要的部分,因为这部分可以令你的进度条活起来。(译注,原来是使用随机的增加15次直到加载完毕,本文仅使用从1-100的匀速增加,以下内容非译)
首先我们新开一个线程,在Page_Load 中加入以下代码:
Thread thread = new Thread( new ThreadStart(ThreadProc) );
thread.Start();
thread.Join();
在类中增加以下函数:
private void ThreadProc()
{
string strScript = "<script>setPgb('pgbMain','{0}');</script>";
for ( int i = 0; i <= 100; i++ )
{
System.Threading.Thread.Sleep(10);
Response.Write( string.Format( strScript, i ) );
Response.Flush();
}
}
注意,在以上代码中我们使用for循环,在i每增加一次的情况下往客户端发送一段脚本<script>setPgb('pgbMain','{0}');</script>,其中的{0}会被相应的i替换,而该段脚本会调用预先写好的javascript函数setPgb,更改页面的进度条状态。

总结:
OK,以上就是实现WEB应用程序中的进度条的全部过程。有任何问题或者需要源码可以与我联系:joise@126.com,http://joise.126.com/,谢谢阅读。
...全文
214 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Proyang 2004-07-23
  • 打赏
  • 举报
回复
这个进度条有以下缺点:
1、不能根据页面加载时间的长短来显示。(程序里写死了2秒)
2、把进程阻塞了。使页面执行时间更长。不能同时执行。
54989875 2004-07-14
  • 打赏
  • 举报
回复
mark
住楼上的老丁 2004-06-20
  • 打赏
  • 举报
回复
kan kan
legend-never-die 2004-04-02
  • 打赏
  • 举报
回复
http://www.csdn.net/Develop/read_article.asp?id=26366
legend-never-die 2004-04-02
  • 打赏
  • 举报
回复
谢谢大家的关注

以下是本文在CSDN文档中心的链接

源码我将放到我的网站上供大家下载,弄好了再告诉大家

To:lizhengCSDNnet(出售.net和flash经典源代码)
在实际项目中可以根据后台程序执行的进度往前端发送脚本

To:IamBird(IamBird)
不可能的吧,我已经运行正常,没有问题的,把你的代码贴出来我看看吧
gzhubonet 2004-04-02
  • 打赏
  • 举报
回复
学习!
lizhengCSDNnet 2004-04-02
  • 打赏
  • 举报
回复
/./Progress/progressbar.htm文件内容:

<html>
<head>
<link rel="stylesheet" type="text/css" href="common.css">
<script language="javascript">
function setPgb(pgbID, pgbValue)
{
if ( pgbValue <= 100 )
{
if (lblObj = document.getElementById(pgbID+'_label'))
{
lblObj.innerHTML = pgbValue + '%'; // change the label value
}

if ( pgbObj = document.getElementById(pgbID) )
{
var divChild = pgbObj.children[0];
pgbObj.children[0].style.width = pgbValue + "%";
}
window.status = "数据读取" + pgbValue + "%,请稍候...";
}

if ( pgbValue == 100 )
window.status = "数据读取已经完成";

}
</script>
</head>
<body bgColor="buttonface" topmargin="0" leftmargin="0">
<table width="100%" height="100%" ID="Table1">
<tr>
<td align="center" valign="middle">
<DIV class="bi-loading-status" id="proBar" style="LEFT: 425px; TOP: 278px"><FONT face="宋体"></FONT>
<DIV class="text" id="pgbMain_label" align="left"></DIV>
<DIV class="progress-bar" id="pgbMain" align="left">
<DIV STYLE="WIDTH:10%"></DIV>
</DIV>
</DIV>
</td>
</tr>
</table>
</body>
</html>
lizhengCSDNnet 2004-04-02
  • 打赏
  • 举报
回复
我有一个登陆页面:我是这样用它的,肯定错了。如何用?
private void Page_Load(object sender, System.EventArgs e)
{
showProgress();//WEB应用程序中的进度条

if(!IsPostBack)
{
loginbtn.Attributes.Add("onmouseover","this.src='images/logindown.gif'");
loginbtn.Attributes.Add("onmouseout","this.src='images/login.gif'");
}
}
private void loginbtn_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
string script = @"<script language='javascript'>"
+"\r"
+"window.opener=null;window.close();var Win = window.open('Webui/main.aspx','main','fullscreen=yes');\r"
+"Win.moveTo(0,0);\r"
+"Win.resizeTo(screen.width,(screen.height-25));\r"
+"</script>";
Response.Write(script);
}
private void showProgress()
{
string strFileName = Path.Combine( Server.MapPath("./Progress"), "progressbar.htm" );
StreamReader sr = new StreamReader( strFileName, System.Text.Encoding.Default );
string strHtml = sr.ReadToEnd();
Response.Write( strHtml );
sr.Close();
Response.Flush();


Thread thread = new Thread( new ThreadStart(ThreadProc) );
thread.Start();
thread.Join();
}
private void ThreadProc()
{
//其中的{0}会被相应的i替换,而该段脚本会调用预先写好的javascript函数setPgb,更改页面的进度条状态。
string strScript = "<script>setPgb('pgbMain','{0}');</script>";
for ( int i = 0; i <= 100; i++ )
{
System.Threading.Thread.Sleep(10);
Response.Write( string.Format( strScript, i ) );
Response.Flush();
}
}
码视野 2004-04-02
  • 打赏
  • 举报
回复
不知道有没有人使用了呢??
我这里运行出现错误:效果是得到了。
行:12
字符:5
错误完成该操作所需的数据还不可用。
代码:0

Seeko0 2004-04-02
  • 打赏
  • 举报
回复
mark,空了看看
wudixiaocaoren 2004-04-02
  • 打赏
  • 举报
回复
好!@
chsfly 2004-04-02
  • 打赏
  • 举报
回复
gz
lizhengCSDNnet 2004-04-02
  • 打赏
  • 举报
回复
如何运行在实际项目中?
comy 2004-04-02
  • 打赏
  • 举报
回复
鼓励一个,加油!!!!!!!!!!!
chnama 2004-04-02
  • 打赏
  • 举报
回复
支持
码视野 2004-04-02
  • 打赏
  • 举报
回复
up
jjstar 2004-04-02
  • 打赏
  • 举报
回复
打个标慢慢看...

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧