Что на самом деле делают функции beforeShowDay и onSelect в следующей реализации виджета Datepicker?
Я только начал работать над сайтом, на котором ранее работал какой-то разработчик. Он внедрил виджет Datepicker на одной из веб-страниц.
Когда я прохожу код этой реализации, я не понимаю, что на самом деле делает код? Я не могу понять, как была написана логика.
Я также просмотрел документацию по API jQuery UI для виджета Datepicker, касающуюся функций beforeShowDay и onSelect, но также не смог найти подсказку, поэтому попросил помощи, чтобы я мог понять следующий код в более простой и описательной форме.
Может кто-нибудь, пожалуйста, заставьте меня понять использование функций beforeShowDay и onSelect в следующей реализации простым и понятным языком?
HTML-код:
<div class="col-md-2 voffset2 rightpad">
<div class="col-sm-3">
<div id="datepicker"></div>
</div>
</div>
Код Javascript:
<script type="application/javascript">
$(document).ready(function() {
/******* Display Calender and events highlighted *******/
/*Not understood what does below array variable has role to play */
var myDates = $.parseJSON('["1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31"]');
$( "#datepicker" ).datepicker({
beforeShowDay: function(date) {
var dateObj = new Date(date);
var month = dateObj.getMonth() + 1;
if(month < 10) {
month = "0"+month;
}
var day = dateObj.getDate();
if(day < 10) {
day = "0"+day;
}
var year = dateObj.getFullYear();
thisdate = year + "-" + month + "-" + day;
if($.inArray(thisdate, myDates) != -1) {
return [true, 'eventDateCls', ''];
} else {
return [true, '', ''];
}
},
onSelect: function(dateText, inst) {
var dateAsString = dateText;
console.log(dateAsString);
url = "http://localhost/CKWEB_28-12-2015/ajax_event.php";
$.ajax({
url: url,
type: "POST",
data: {event_date:dateAsString},
beforeSend: function() {
$('#loader-icon').show();
},
complete: function() {
$('#loader-icon').hide();
},
success: function(data) {
$("#eventListing").html(data);
$('#loader-icon').hide();
},
error: function(){}
});
}
});
/******* Display Calender and events highlighted *******/
});
</script>
2 ответа
beforeShowDay
Функция называется beforeShowDay
используется для добавления определенного класса CSS в каждую ячейку средства выбора даты при выполнении определенного условия. В вашем случае это условие "если точное date
ячейки равен одной из дат события, ранее определенных в myDates
".
Позвольте мне разобрать код для вас:
ЧАСТЬ 1
var myDates = $.parseJSON('["1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31","1969-12-31"]');
Это та часть, где myDates
переменная определена и ей присвоено значение. Это значение, очевидно, является значением макета, поскольку 1969-12-31 не может быть встречено ни одной датой выбора даты jQuery.ui, которая начинается с 01.01.1970. Вы можете изменить это значение на даты реального события четырьмя способами:
- Установите его динамически с помощью вызова AJAX и назначьте
$.parseJSON(returnedJSON)
вmyDates
перед$(selector).datepicker(options)
функция называется. - Установите его динамически, вставив строку JSON в
data-anyname
атрибут#datepicker
сам с помощью любого серверного скрипта (<?php echo json_encode($eventDatesArray); ?>
если PHP), а затем читать его с помощью JavaScript из этого элемента, назначив$.parseJSON($(this).data('anyname'))
вmyDates
перед$(selector).datepicker(options)
функция называется. - Добавьте это динамически в вашем
<script>
используя серверный скрипт, если<script>
имеет встроенный код, а не ссылку на внешний файл. - Заменить текущие даты в уже существующем скрипте.
ЧАСТЬ 2
var dateObj = new Date(date);
var month = dateObj.getMonth() + 1;
if(month < 10) {
month = "0"+month;
}
var day = dateObj.getDate();
if(day < 10) {
day = "0"+day;
}
var year = dateObj.getFullYear();
thisdate = year + "-" + month + "-" + day;
Это та часть, где разработчик получает полную дату ячейки datepicker и назначает ее thisdate
в виде строки с желаемым форматом. Используя только thisdate = $.datepicker.formatDate("yy-mm-dd", new Date(date));
было бы намного проще, хотя.
ЧАСТЬ 3
if($.inArray(thisdate, myDates) != -1) {
return [true, 'eventDateCls', ''];
} else {
return [true, '', ''];
}
Это та часть, где эта дата ищется в ранее определенные даты. Вот, eventDateCls
имя класса для выделения ячеек даты события. Если дата ячейки является одной из дат события, ячейка будет иметь класс с именем eventDateCls
и будет выделено. Опять же, лучший способ, вероятно, будет использовать только return [true, (myDates.indexOf(thisdate)<0) ? '' : 'eventDateCls',''];
onSelect
Что касается onSelect
, это просто функция обратного вызова, инициируемая событием, которая получает выбранную дату в виде текста и отправляет ее некоторым http://localhost/CKWEB_28-12-2015/ajax_event.php
, что бы это ни было. Мы не можем точно знать, что именно он делает, но это файл PHP, вероятно, используемый для проверки и сохранения (вставки в БД) выбранной информации о дате. Единственное, что мы знаем, это то, что он должен возвращать (эхо) некоторую строку, которая может быть непосредственно вставлена в DOM $("#eventListing").html(data)
вызов.
Для начала, это две ужасно разработанные и реализованные функции. Сеанс проверки кода отклонил бы их.
beforeShowDay
может использоваться для управления 3 свойствами дня в календаре:
- Выбирается ли дата или нет.
- Примените пользовательский класс CSS.
- Прикрепите пользовательскую подсказку.
К сожалению, реализация не делает ничего, кроме как сравнивает даты со статическим массивом, содержащим ту же сущность старой даты, и фактически просто возвращает значение, которое указывает, что даты могут быть выбраны, и никакой специальный CSS или подсказка не используются.
onSelect
реагирует на пользователя, выбирающего конкретную дату, отправляя запрос ajax на сервер. Он также контролирует некоторый "загружающий" элемент пользовательского интерфейса и в конечном итоге использует результат запроса для замены содержимого другого элемента.