2010-05-19 62 views
1

我正在使用以下代码来捕获从我的应用程序进行的所有AJAX调用,以便显示忙碌的调整程序直到调用完成。当请求很好地分开时,它运行良好。但是,当请求快速连续进行时,某些AJAX调用不会被注册,或者onCreate和onComplete操作同时被启动,并且更多时候,繁忙的微调器继续出现在屏幕上,所有的电话都成功完成后。在通话结束时是否可以执行任何检查,检查元素是否可见,我可以隐藏它。Effect.toggle和AJAX调用

document.observe("dom:loaded", function() { 
$('loading').hide(); 
Ajax.Responders.register({ 
//When an Ajax call is made. 
onCreate: function() { 
new Effect.toggle('loading', 'appear'); 
new Effect.Opacity('display-area', { from: 1.0, to: 0.3, duration: 0.7 }); 
}, 

onComplete: function() { 
new Effect.toggle('loading', 'appear'); 
new Effect.Opacity('display-area', { from: 0.3, to: 1, duration: 0.7 }); 
} 
}); 
}); 

谢谢!

回答

1

您需要对正在处理的AJAX请求的数量进行计数,并且只在没有进一步处理请求时隐藏加载指示器。

类似于以下try代码:

document.observe("dom:loaded", function() { 

    var ajaxRequestsInProgress = 0; 

    $('loading').hide(); 

    Ajax.Responders.register({ 
    //When an Ajax call is made. 
    onCreate: function() { 
     if(!ajaxRequestsInProgress) 
     { 
     new Effect.toggle('loading', 'appear'); 
     new Effect.Opacity('display-area', { from: 1.0, to: 0.3, duration: 0.7 }); 
     } 
     ajaxRequestsInProgress++; 
    }, 

    onComplete: function() { 
     ajaxRequestsInProgress--; 
     if(!ajaxRequestsInProgress) 
     { 
     new Effect.toggle('loading', 'appear'); 
     new Effect.Opacity('display-area', { from: 0.3, to: 1, duration: 0.7 }); 
     } 
    } 
    }); 
}); 
+0

谢谢!奇迹般有效。 bmoeskau和Josh提出的答案都表达了同样的想法! – Gunner4Life 2010-05-19 19:05:37

+0

这是因为伟大的思想者都相同;-) – Josh 2010-05-19 19:17:11

2

一个简单的方法是创建一个计数器变量,它的作用域在两个函数之外,并在onCreate中递增并在onComplete中递减。然后只在计数器达到0时隐藏微调器。