我写了一些代码,你选择一个国家后过滤省/州选择字段:如何避免3个Ajax调用?
var cache = {};
function updateProvinceOptions($select, values, initial) {
for(i in values) {
$select.append('<option value="'+values[i][0]+'">'+values[i][1]+'</option>');
}
$select.val(initial).trigger('change');
}
$('<select class="province" />').insertBefore('.province').change(function() { // insert select boxes beside hidden province inputs
$(this).siblings('input.province').val($(this).val()); // update hidden input with current value
});
$('.country').change(function() {
var $countrySel = $(this);
var $provSel = $countrySel.parent().parent().next().children('td').children('select.province');
var $provInput = $provSel.siblings('input.province');
var country = $countrySel.val();
var province = $provInput.val();
$provSel.empty();
if(country in cache) {
updateProvinceOptions($provSel, cache[country], province);
}
else {
$provSel.addClass('loading');
$.getJSON('/get-provinces.json', {'country':country}, function(provinces) {
$provSel.removeClass('loading');
cache[country] = provinces;
updateProvinceOptions($provSel, provinces, province);
});
}
}).trigger('change');
它甚至缓存的结果,这样,如果你说,再次选择加拿大,当时的美国,然后加拿大,它不需要再次在加拿大省份列表中找到服务器。不过,我同时在页面上显示了其中的3个。当页面首次加载时,缓存中没有任何内容,因此,所有3个em都打到了服务器以获取省份列表,因为没有ajax调用返回。
是否有一个相对简单的方法告诉它“等待”该国家的ajax呼叫是否正在进行中?或者我应该甚至打扰?
是的,真/假部分是简单的位(确定数据是否已被请求)......但是如何插入延迟?我想你会添加一个“waitingOn”队列......并且当ajax complete方法激发时,你遍历所有的服务员...... – mpen 2010-07-14 23:44:51
看起来你已经想通了。很高兴我可以帮忙,如果我做了。看起来像你自己想出来的。只需要一个小指针。 – spinon 2010-07-15 00:14:22