如何控制在jQuery $(document).ready中调用的函数的顺序

我需要能够控制$(document).ready事件中正在处理的项目的顺序。
这些是多个控件,从多个文件加载,都要求在ready事件中调用。 它们都启动了对服务器的异步调用(AJAX)。 只有在他们全部完成后,我才需要做一些额外的工作。

对此有什么优雅的解决方案?

异步请求按顺序触发 ,但将以它们首先完成的任何顺序返回。 因此,没有一种确定的强制方法可以强制它们同时结束,但是,您可以构建规则以仅在某些组返回后运行代码。

例如,使用一组规则定义回调函数,并将其传递给所有ajax请求的每个success回调。

 var completedObject = {}; function groupSuccessCallback() { // Test for any combination of requirements if ( completedObject.ajax1 && completedObject.ajax2 ) { ... // Do something that only requires 1 and 2 } if ( completedObject.ajax1 && completedObject.ajax2 && completedObject.ajax3) { ... // Do something that requires all 3 being done // your data is available at completedObject.ajax# } // Or test for _all_ entries for a dynamic count var allComplete = true; for(var i in completedObject) { if ( completedObject.hasOwnProperty(i) && !completedObject[i] ) { allComplete = false; } } // Do whatchya need. if (allComplete) { alert("bb-b-bb-bbb-bbb... that's all folks!"); } } 

然后设置成功函数内的标志:

 // Ajax1 completedObject['anything'] = false; // instantiate a dynamic entry in the object or use an array if you can't use names. $.ajax({ ..., ..., success: function(data) { completedObject['anything'] = data || true; groupSuccessCallback(); } }); 

John Resig关于$(document).ready中的函数评估顺序:

每次将新函数添加到队列时,它都会被添加到数组中 – 然后在执行时再次弹回。 如果这不适合你,请告诉我。

$ .readyList – 仅在1.4之前的版本中

jQuery公开了一个名为$.readyList的属性,它是一个允许函数orded操作的数组,但$ .readyList不再公开在jQuery 1.4.0中公开

黑客的方式

你可以尝试$(window).load(function () {}); ,它应该在整个窗口加载后执行(不是在文档准备就绪时,因为它与$(document).ready()

根据页面的其余部分,在$ .ajaxStop处理程序中执行“额外工作”可能是更优雅的选项。

但是,如果用户能够和/或可能这些初始调用正在进行触发后续的$ .ajax()调用,那将是不合适的。 在这种情况下,他们手动触发的调用可能比预期更长时间地延长$ .ajaxStop事件。

创建值为0的变量。在每个Ajax调用的成功函数中,将值增加1并检查该值是否等于调用的总数(如果它执行完成函数)。