所以,我有一个页面,通过jquery.get进行多个请求,以填充下拉菜单的值。
$(function() {
LoadCategories($('#Category'));
LoadPositions($('#Position'));
LoadDepartments($('#Department'));
LoadContact();
};
然后它调用LoadContact(); 这会再次调用另一个函数,当它返回时,它会填充表单上的所有字段。问题在于,经常情况下,下拉列表没有全部填充,因此无法将其设置为正确的值。
我需要做的是,让LoadContact仅在其他方法完成并且回调执行完毕后执行。
但是,我不想在下拉列表填充回调结尾处放置一堆标志,然后检查它们,并且在调用LoadContact()之前必须有一个递归的setTimeout调用来检查。
在jQuery中是否有一些内容可以让我说:“当所有这些都完成时,请执行此操作。”?
更多信息 我正在考虑类似以下方式的内容
$().executeAfter(
function () { // When these are done
LoadCategories($('#Category'));
LoadPositions($('#Position'));
LoadDepartments($('#Department'));
},
LoadContact // Do this
);
在执行方法期间,它需要跟踪发生的ajax调用,并在它们全部完成时调用LoadContact;
如果我知道如何拦截在该函数中进行的ajax,我可能会编写一个jQuery扩展来实现这一点。
我的解决方案
;(function($) {
$.fn.executeAfter = function(methods, callback) {
var stack = [];
var trackAjaxSend = function(event, XMLHttpRequest, ajaxOptions) {
var url = ajaxOptions.url;
stack.push(url);
}
var trackAjaxComplete = function(event, XMLHttpRequest, ajaxOptions) {
var url = ajaxOptions.url;
var index = jQuery.inArray(url, stack);
if (index >= 0) {
stack.splice(index, 1);
}
if (stack.length == 0) {
callback();
$this.unbind("ajaxComplete");
}
}
var $this = $(this);
$this.ajaxSend(trackAjaxSend)
$this.ajaxComplete(trackAjaxComplete)
methods();
$this.unbind("ajaxSend");
};
})(jQuery);
在调用方法时,这将绑定到ajaxSend事件,并保留所调用的URL(需要更好的唯一ID)列表。 然后从ajaxSend解绑,以便仅跟踪我们关心的请求。 它还绑定到ajaxComplete并在返回时从堆栈中删除项目。 当堆栈达到零时,它执行我们的回调函数,并解绑ajaxComplete事件。