【发布时间】:2011-02-14 18:55:16
【问题描述】:
我想制作一个使用 jquery 将关键字列表提交到 php 文件的表单,根据关键字列表的大小,该文件可能需要很长时间才能加载。
我想做的是将php响应实时加载到div或容器中,而不使用iframe。
我知道的所有 ajax 请求都必须等到请求完成才能访问响应,即使响应尚未完成,我也需要访问该响应,以便我可以实时更新进度。
【问题讨论】:
标签: php ajax asynchronous jquery
我想制作一个使用 jquery 将关键字列表提交到 php 文件的表单,根据关键字列表的大小,该文件可能需要很长时间才能加载。
我想做的是将php响应实时加载到div或容器中,而不使用iframe。
我知道的所有 ajax 请求都必须等到请求完成才能访问响应,即使响应尚未完成,我也需要访问该响应,以便我可以实时更新进度。
【问题讨论】:
标签: php ajax asynchronous jquery
确实有办法。使用普通的旧 xmlhttpobjects 我监控了 readyState。就绪状态 4 表示请求已结束。就绪状态 3 意味着我可以得到一些输出并等待更多:
request.onreadystatechange=function()
{
switch(request.readyState)
{
case 4:
console.log("all good things come to an end");
break;
case 3:
console.log("o, hai!" + request.responseText);
break;
}
}
我相信你可以使用 jQuery 实现同样的效果:jQuery: Is req.readyState == 3 possible?
【讨论】:
最近 Josh 发布了关于 COMET 技术的文章,这似乎适合您。有几个有趣的链接,其中包含 php 中的示例。
【讨论】:
更新:使用 Ajax 最可靠的方法是将每个 Ajax 请求视为原子的:它可以工作,也可以不工作。
当你的请求正在执行时,你(页面上运行的 JS)并没有真正得到任何反馈。所以你需要多次调用。但小心点!每次调用的开销很大,大多数浏览器一次只能执行一个或两个。
我建议对人类使用忙碌指示器。您还可以显示每秒至少更新两次的倒计时时钟,以使其看起来好像正在发生某些事情。
添加:
您可能还想重新设计您的解决方案。例如,将更新过程视为 Ajax 通过提交请求启动的批处理作业。然后进行进一步的 Ajax 调用以学习(然后)向人类显示批处理作业的进度。
可以使用彗星和其他“保持管道畅通”策略,但很难可靠地工作,并且往往会使用大量资源。更多的行人投票技术可以更容易上手。然后根据需要进行优化。
【讨论】:
听起来您需要使用多个较小的请求而不是一个大请求。
【讨论】: