leo*_*ora 34 ajax jquery progress-bar
我有一个Ajax调用,它更新了数据库中的5,000条记录,因此这需要花费很多时间.我有一个Ajax"正在加载图片",显示正在发生的事情,但我正在寻找一种更好的方式来显示"正在更新50的5000 ...","更新200的5000",或类似的东西.
在不执行5000个不同帖子的情况下,在Ajax/jQuery中执行此类操作的最佳方法是什么?
Zai*_*ikh 23
我认为最好的是使用Comet.
在Comet风格的应用程序中,服务器实际上可以将数据推送到客户端(而不是一次又一次地从服务器请求客户端请求数据).客户端只需连接一次服务器.然后服务器将继续将数据推送回客户端.
来自维基百科:
Comet是一种编程技术,它使Web服务器能够将数据发送到客户端,而无需客户端请求它.它允许创建托管在浏览器中的事件驱动的Web应用程序.
现在让我们来看看Comet是如何工作的.请参阅以下服务器端代码.这里while正在使用循环,您可以设置自己的条件.在while循环中,页面写入日期时间并刷新然后休眠1/2秒.
ASP.NET页面代码隐藏:Service.aspx.cs
public static string Delimiter = "|";
protected void Page_Load(object sender, EventArgs e)
{
Response.Buffer = false;
while (true)
{
Response.Write(Delimiter
+ DateTime.Now.ToString("HH:mm:ss.FFF"));
Response.Flush();
// Suspend the thread for 1/2 a second
System.Threading.Thread.Sleep(500);
}
// Yes I know we'll never get here,
// it's just hard not to include it!
Response.End();
}
Run Code Online (Sandbox Code Playgroud)
客户端代码 - 纯JavaScript
只有发出请求一次,然后保持在检查数据readyState === 3的XMLHttpRequest.
function getData()
{
loadXMLDoc("Service.aspx");
}
var req = false;
function createRequest() {
req = new XMLHttpRequest(); // http://msdn.microsoft.com/en-us/library/ms535874%28v=vs.85%29.aspx
}
function loadXMLDoc(url) {
try {
if (req) { req.abort(); req = false; }
createRequest();
if (req) {
req.onreadystatechange = processReqChange;
req.open("GET", url, true);
req.send("");
}
else { alert('unable to create request'); }
}
catch (e) { alert(e.message); }
}
function processReqChange() {
if (req.readyState == 3) {
try {
ProcessInput(req.responseText);
// At some (artibrary) length recycle the connection
if (req.responseText.length > 3000) { lastDelimiterPosition = -1; getData(); }
}
catch (e) { alert(e.message); }
}
}
var lastDelimiterPosition = -1;
function ProcessInput(input) {
// Make a copy of the input
var text = input;
// Search for the last instance of the delimiter
var nextDelimiter = text.indexOf('|', lastDelimiterPosition + 1);
if (nextDelimiter != -1) {
// Pull out the latest message
var timeStamp = text.substring(nextDelimiter + 1);
if (timeStamp.length > 0) {
lastDelimiterPosition = nextDelimiter;
document.getElementById('outputZone').innerHTML = timeStamp;
}
}
}
window.onload = function () { getData(); };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15750 次 |
| 最近记录: |