asp/ajax实现进度条方案

     由asp生成静态页面html的时候,如果内容较多,采用进度条的方式显示当前进度是一个很好的办法。当然,进度条的应用,一般是耗时较长的操作,如果不采用进度条显示当前状态,不管是对于前台应用的客户还是对于管理员在后台的应用来说,总是让人不太舒服的事情。

     记得我在04年将租房网程序改版时,主要的目的就是将房源信息的动态页面生成纯静态HTML页面。当时是通过Form表单提交当前页面,通过参数值的变化来显示当前进度界面。

     今天无意中看到网上一篇:巧用Response.Flush实时显示进度。内容也无非说明Response.Flush的功能,以及实现进度条的方案。我突然闪出一个想法,能否用ajax来实现进度条呢。对于我来说,如果能用ajax实现,我一般是不用form来提交表单处理的。因此有了下面的代码

 test.asp代码内容如下

<%
Response.Expires=-1000
Response.Buffer=True
Response.ExpiresAbsolute=Now()-1
Response.CacheControl="no-cache"
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-ctrol","no-cache"
Response.Charset="GB2312"
Server.ScriptTimeOut=60*60*24
CONST MM_BarWidth="250"'进度条总宽度
%>







生成进度:
生成信息: 0%

test1.asp代码内容如下

<%
Response.Expires=-1000
Response.Buffer=True
Response.ExpiresAbsolute=Now()-1
Response.CacheControl="no-cache"
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-ctrol","no-cache"
Response.Charset="GB2312"
Server.ScriptTimeOut=60*60*24
CONST MM_BarWidth="250"'进度条总宽度
'#######################################################################
Dim N,i,cardStr,CountNum
Dim k:k=Trim(Request.Form("k"))
CountNum=999'要处理的数据总数
For N=k To CountNum
  For i=0 To 100
    cardStr="MM"&makeRnd(20) '为了测试效果,延时用。
  Next
  k=k+1
  IF k mod 1=0 Then'1为处理多少数据显示。可以是任意整数 比如IF k mod 10=0 Then等等
  Response.Write ""
  response.end
  End IF
Next
Response.Write ""
Response.End

Function makeRnd(n)
  ReDim tmpArr(n-1)
  For j=0 to n-1
    Do
      Randomize
      asciicode=Int((122-48+1)*Rnd+48)
      Loop Until asciicode<=57 OR (65<=asciicode AND asciicode<=90) OR 97<=asciicode
      tmpArr(j)=Chr(asciicode)
    Next
  makeRnd=Join(tmpArr,"")
End Function
%>

可以将以上内容保存文件执行查看效果。

在上面实现进度条方案之前,我是在test.asp文件中通过
function test(){
mmAjaxUpdater('test1.asp','');//注意,这里没有加上参数k
}
执行test1.asp文件时是在test1.asp循环中,通过Response.Flush来达到这个效果。

<%
Response.Expires=-1000
Response.Buffer=True
Response.ExpiresAbsolute=Now()-1
Response.CacheControl="no-cache"
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-ctrol","no-cache"
Response.Charset="GB2312"
Server.ScriptTimeOut=60*60*24
CONST MM_BarWidth="250"'进度条总宽度
'#######################################################################
Dim N,cardStr,CountNum
dim i,k
CountNum=999'要处理的数据总数
For N=k To CountNum
  For i=0 To 100
    cardStr="MM"&makeRnd(20) '为了测试效果,延时用。
  Next
  k=k+1
  IF k mod 10=0 Then
    Response.Write "$('img2').width=" & Fix((k/CountNum) * MM_BarWidth) & ";$('txt2').innerHTML=""当前进度:" & FormatNumber(k/CountNum*100,4,-1) & "%"";test();"
    Response.Flush
  End IF
Next
Response.Write ""
Response.Flush
%>

遗憾的是,结果它并不实时显示,而只显示最终的结果,这对于进度条来说,一个意义没有。所以我加上参数k,来控制进度条的显示。

这是今天想到的通过ajax实现进度条的处理方案,另外在说明一下:采用本方案,可以实时终止程序,不像以前,如果采用form提交,由于后台是一次性处理,所以你无法在程序执行后终止它,这一点,在有些场合尤为重要。本程序仅提供思路,没有深入从程序质量上过多考虑,欢迎交流并完善。

以上代码涉及的prototype文件下载:http://download.csdn.net/detail/zm2714/4543744

你可能感兴趣的:(asp)