Я постараюсь держать это коротко и по существу.
У меня есть настройка datePicker
, которая используется для сайта размещения, чтобы установить даты заезда / выезда.Я использую beforeShowDay
, чтобы запросить файл XML, который содержит данные о доступности и скорости.Я настроил и работаю правильно.
Когда месяц меняется, у меня есть функция onMonthChange
для повторного запроса информации на следующие / предыдущие месяцы, это также работает, как и ожидалось, за исключениемодна важная часть:
Проблема: Если вы быстро щелкнете по месяцам, в течение которых возвращаемые данные XML не могут идти в ногу, значит, даты неверно отображаются как недоступные.
Мне нужно выполнить одно из следующих действий:
- После загрузки данных календарь обновится, чтобы показать правильную доступность
- Кнопка пересылки месяца отключена до тех пор, пока данные не будут загружены.
Что я пробовал
- Скрытие изменения месяцакнопка в начале функции onMonthChange, затем показывает ее в конце - это не работает.
- Использование
async:false
в функции get - я чувствую, что это решение, но я не могу заставить его работатьпоскольку я не могу найти четкую документацию о том, куда она должна идти.
Код:
/* Date Picker */
var datepickerOptions = {
dateFormat: 'yy-mm-dd',
};
var checkInOptions = {
showOtherMonths: false,
minDate: 0,
beforeShowDay: addPrice,
onSelect: openCheckout,
onChangeMonthYear: onMonthChange,
dateFormat: 'yy-mm-dd'
};
j.getJSON("/availability.php?startDate="+year+"-0"+month+"-01&id="+j('#property_id').text(),
{ format: "json" },
function(data) {
document.pricesData = data;
document.firstDate = '';
j('#calendar_check_in').datepicker(checkInOptions);
/* Tip Tip */
j('.ui-datepicker-calendar td').tipTip({ defaultPosition: "right" });
for (var key in document.pricesData) {
var obj = document.pricesData[key];
if(obj['avail'] == 1 && document.firstDate == ''){
document.firstDate = key;
}
}
d = new Date(document.firstDate.substr(5));
d.setMonth(d.getMonth()+1);
});
function addPrice(date) {
calDate = new Date(date);
dateString = 'date_'+calDate.getFullYear()+'-'+('0'+(calDate.getMonth()+1).toString()).substr(-2)+'-'+('0'+(calDate.getDate()).toString()).substr(-2);
if(document.pricesData[dateString] != undefined){
var priceString = document.pricesData[dateString]['price'];
if(document.pricesData[dateString]['avail'] == "1"){
valid = true;
} else {
valid = false;
}
}else{
var priceString = 'Price not available';
valid = false;
}
return [valid, '', priceString];
}
function onMonthChange(year, month, inst){
/* Date Picker */
month--;
j.getJSON("/availability.php?startDate="+year+"-0"+month+"-01&id="+j('#property_id').text(),
{ format: "json" },
function(data) {
document.pricesData = data;
document.firstDate = '';
/* Tip Tip */
j('.ui-datepicker-calendar td').tipTip({ defaultPosition: "right" });
for (var key in document.pricesData) {
var obj = document.pricesData[key];
if(obj['avail'] == 1 && document.firstDate == ''){
document.firstDate = key;
}
}
d = new Date(document.firstDate.substr(5));
d.setMonth(d.getMonth()+1);
});
}
Спасибо всем, кто нашел время, чтобыПрочитайте это, надеясь, что у кого-то есть какое-то решение, потому что в данный момент это немного похоже на пробку!
Спасибо!