惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
V2EX - 技术
V2EX - 技术
T
Troy Hunt's Blog
TaoSecurity Blog
TaoSecurity Blog
Attack and Defense Labs
Attack and Defense Labs
SecWiki News
SecWiki News
M
MIT News - Artificial intelligence
N
News and Events Feed by Topic
Help Net Security
Help Net Security
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
The Last Watchdog
The Last Watchdog
Martin Fowler
Martin Fowler
Hacker News: Ask HN
Hacker News: Ask HN
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
H
Heimdal Security Blog
B
Blog
Blog — PlanetScale
Blog — PlanetScale
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Threat Research - Cisco Blogs
I
InfoQ
腾讯CDC
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Know Your Adversary
Know Your Adversary
Cloudbric
Cloudbric
Project Zero
Project Zero
T
Tor Project blog
小众软件
小众软件
博客园 - 司徒正美
www.infosecurity-magazine.com
www.infosecurity-magazine.com
H
Help Net Security
Webroot Blog
Webroot Blog
量子位
NISL@THU
NISL@THU
Schneier on Security
Schneier on Security
Google Online Security Blog
Google Online Security Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
月光博客
月光博客
宝玉的分享
宝玉的分享
V
V2EX
T
Tailwind CSS Blog
Spread Privacy
Spread Privacy
G
Google Developers Blog
K
Kaspersky official blog

博客园 - wuhang

c#后台写javascript前端调用 动态SQL语句根据数据库列来查询数据,动态的生成列名称 asp.net的自动跳转 【转载来的】关于句柄的一些知识 [转载来的]C# API 大全 [心情日記]亦夢亦幻 【转载来的】C# 2.0中P/Invoke支持的几处增强 [转载来的]P/Invoke使用Win32非托管函数2 [转载来的]P/Invoke使用Win32非托管函数3 [转载来的]P/Invoke使用Win32非托管函数1 转载来的WCF基础知识问与答 转载来的,线程的基础 转载来的线程池 转载来的WinForm多线程编程篇 还是转载的C# 插件构架实战 依旧是转载来的Thread and Sync In C# (C#中的线程与同步) 转载来的C# 2.0中P/Invoke支持的几处增强 还是转载来的P/Invoke使用Win32非托管函数 转载来的P/Invoke调用,来自MSDN
今天看到一个好的WEB进度条,博客园果然是富饶啊,先记录下来以备后用
wuhang · 2013-05-20 · via 博客园 - wuhang

WEB应用程序中的进度条

Julien Cheyssial 写作于2003/10/01

Joise.LI翻译并修改于2004-4-2

写在前面:

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

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

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

第一步: 

       第一步让我们来建立一个进度条页面,我们使用progressbar.aspx。如上所述,我们逐步生成并发送页面到客户端。首先,我们将使用HTML生成一个完美并且漂亮的进度条。所需要的HTML代码我们可以从事先定义的progressbar.htm中获取,所以,第一件事情是装载它并且将数据流发送到客户端的浏览器,在progressbar.aspxPage_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,更改页面的进度条状态。