是否有机会在使用经典asp创建循环时显示加载栏?
我想到了一些ajax风格的加载栏,它显示页面正在创建一些东西。
我尝试使用包含进程状态信息的会话变量来实现,但在此我发现asp服务器有一个队列,这意味着你可以同时只运行一个asp页面。
在加载asp页面时,我无法在具有相同会话的sam服务器上打开另一个asp页面。使用新会话是可能的,但我想使用相同的会话(如果可能的话)。
思想: 是否可以使用ajax请求来请求asp页面并在页面加载时显示加载栏?
是否有解决方法来处理状态栏?
(抱歉英文不好) 谢谢
编辑:
我是这样但我无法通过asp页面访问会话变量。 第一个asp请求完成后,会话阅读器页面只给出了答案。我认为这是一个会话队列 - 想想。
对我来说这看起来像这样:
ajax页面 - (请求进程asp页面) - > process.asp中
(相同的ajax页面) - (请求会话读者页面) - > sessionreader.asp
while sessionstatus!= 100 show process bar
问题是我在process.asp完成后得到了sessionreader.asp的答案。这就是为什么我认为这是一个asp-session-queue-think。
如果给第二个请求一个新的会话ID(如果可能的话),它可能会有效吗?
答案 0 :(得分:3)
您可以在发送请求时在客户端触发GIF动画。
答案 1 :(得分:1)
曾经有一个技巧,要么禁用Response.Buffer(将其设置为false),要么让它被缓冲,但有时你会根据想要更新进度来执行Response.Flush。
所以,假设你的进度条位于页面顶部的某个位置(图像或表格或div或任何你想要的东西),并且你在asp脚本中做了一些事情(比如循环),不时,将javascript刷新回客户端以更新应该已经在屏幕上的进度条。类似的东西:
<%
REM Might be a good idea to set the timeout to some large number here...
Response.Timeout = ...
%>
<html>
:
<body>
<p>Please wait...<span id="progress">0</span>% completed.</p>
: content here...
<%
REM Make sure the things above this get sent to the client first
REM so they will be rendered before the rest of the page is rendered.
Response.Flush()
For iCnt = 0 To 100
REM Do some stuffs here...
%>
<script>$("#progress").html(i)</script>
<%
Response.Flush()
Next
%>
: some more contents here...
</body>
</html>
我不确定这是否仍适用于现代浏览器,暂时不使用它。
答案 2 :(得分:0)
只用一个asp页面就无法做到这一点。您将需要一个向用户显示的页面(进度栏的生命周期)。然后你需要在循环中对一个读取会话对象的页面进行ajax调用(使用jQuery ??)。并且您将需要一个实际正在处理的页面,并将其状态写入由ajax调用定期监视的会话。您需要使用ajax定期调用以检查会话,直到达到最终结果。如果这是一个非常漫长的过程,你可以在会话中存储一个数字,比如1-100 ......但10,20,......,100可能效果最好。当你达到100时,你将打破循环,不再轮询会话阅读页面。
这样做的原因是您需要一个页面显示给您的酒吧用户。
正在进行处理的页面在完成处理之前无法向用户显示任何内容。
简单读取会话的页面可以快速处理并快速显示其结果。
有意义吗?
答案 3 :(得分:0)
问题在于您正在使用Windows XP进行开发并遇到IIS 5一次只能处理一个请求的限制。 因为您怀疑在您尝试监视的原始请求完成之前,AJAX请求的进度没有返回。
我知道这个版本的IIS没有办法解决这个问题。内置的另一个限制可能是阻止您在生产环境中使用XP IIS 5。即使第二个请求来自另一台具有不同IP地址的计算机,在第一个请求完成之前也不会被处理。