增量输出 - Jquery和PHP

时间:2010-01-26 17:18:41

标签: php jquery

我有一个应用程序可以评估大量项目并为每个项目输出一个分数。

在我的php脚本中,我使用ob_start和ob_flush来处理每个评级的数据输出。如果我直接加载脚本,这很好用。但是当我尝试通过jquery使用.get时,整个内容加载然后被放入容器中,而不是逐步添加。

我想知道以下

  1. 有没有办法在get完成之前启动数据放置?
  2. 在完成此过程之前,是否需要不断轮询脚本?
  3. 是否有更有效的方式来显示数据而不是get?

3 个答案:

答案 0 :(得分:2)

对于这类问题,我会采用这种方法:

  1. 将使用ob_start()ob_flush()的旧脚本保留给在浏览器中禁用javascript的用户。
  2. 对于启用了javascript的用户,一次加载一个预定义的数字内容。要区分js启用用户与否,我想2页。在第一页中,您将显示指向旧脚本的链接。然后在此页面中放置一个jquery代码以拦截单击旧脚本的链接,因此单击该链接将显示(或创建)div,然后将内容加载到div
  3. 您可以使用setTimeout连续调用AJAX代码,然后在达到某个条件后(例如,空响应),您可以使用setTimeout删除clearTimeout。每个AJAX请求都需要有一个偏移参数,因此它将从上一次AJAX调用中获取内容。收到响应后,增加下一个AJAX调用的偏移量。您可以使用全局变量。
  4. 您可以使用一个简单的全局变量来阻止AJAX请求在最后一个AJAX仍在等待响应时运行,以防止竞争条件。示例代码:

    //lock variable
    var is_running = FALSE;
    //offset start with 0
    var offset = 0;
    function load_content($) {
      //check lock
      if (! is_running) {
        //lock
        is_running = true;
        //do AJAX
        $.get(URL,
          { PARAM },
          function(resp){
            //put data to 'div'
            //...
            //if empty, then call clearTimeout
            //...
            //increase offset here
            offset = offset + NUM_ITEM_FETCHED
            //release lock
            is_running = false;
          });
      }
    }
  5. 您必须注意使用AJAX调用时必须注意,必须手动确定响应,因为ob_startob_flush在此方案中无效。

    我希望这可以帮助您创建自己的代码。

答案 1 :(得分:1)

当整个页面加载完成后,Jquery将从ajax调用中获得成功状态..所以无论你在php中做什么都不会返回到调用页面,直到整个过程完成..(ajax是一个-send / one-receive system)

您需要使系统复杂化以执行您想要的操作..

例如..

  1. 你的php更新了一个进度的外部文件,你的jquery在某个时间间隔内轮询这个文件并显示进度。
    您将在ajax提交上启动间隔轮询,并在ajax成功终止它..

答案 2 :(得分:1)

我有一个类似的问题,我想要一个PHP脚本发送一系列电子邮件并更新jquery页面,说“发送23/50”。

我最终做的是设置php脚本来一次处理一个项目。这可能也适用于您的情况。你有没有jquery将某种项目标识符传递给只处理那一项的php脚本?然后在回调中,您可以将该项目的数据放在页面中,也可以为下一个项目创建新的ajax请求。换句话说,每个回调都会为下一个项目创建一个新请求,直到整个项目列表循环完成。

您怎么看?

-DLH