Я написал код, который фильтрует поле выбора провинции / штата после выбора страны:
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 из них попадают на сервер для получения списка провинций, поскольку ни один из вызовов ajax еще не вернулся.
Есть ли относительно простой способ сказать ему "ждать", если уже выполняется вызов ajax для этой страны? Или мне вообще надоело?