Выделить даты в jquery UI datepicker
Как я могу использовать beforeShowDay для выделения дней в jQuery UI datepicker. У меня есть следующий массив дат
Array
(
[0] => 2011-07-07
[1] => 2011-07-08
[2] => 2011-07-09
[3] => 2011-07-10
[4] => 2011-07-11
[5] => 2011-07-12
[6] => 2011-07-13
)
Ответы
Ответ 1
Я решил проблему, используя
var disabledDays = ["2011-7-21","2011-7-24","2011-7-27","2011-7-28"];
var date = new Date();
jQuery(document).ready(function() {
$( "#dateselector").datepicker({
dateFormat: 'yy-mm-dd',
beforeShowDay: function(date) {
var m = date.getMonth(), d = date.getDate(), y = date.getFullYear();
for (i = 0; i < disabledDays.length; i++) {
if($.inArray(y + '-' + (m+1) + '-' + d,disabledDays) != -1) {
//return [false];
return [true, 'ui-state-active', ''];
}
}
return [true];
}
});
});
Ответ 2
Посмотрите документацию.
beforeShowDay Функция принимает дату как параметр и должна возвращать массив с [0] равным true/false, указывающий, выбрана ли эта дата или нет, [1], равное имени класса CSS или '' для представления по умолчанию, и [2] необязательная всплывающая подсказка для этой даты. Он вызывается для каждого дня в datepicker перед его отображением.
Это означает, что вам нужно создать функцию, которая будет принимать дату и вернуть массив параметров, где значения:
- boolean - указывает, может ли быть выбрана дата
- string - имя класса css, которое будет привязано к дате
- string - необязательная всплывающая подсказка для этой даты
вот пример:
var your_dates = [new Date(2011, 7, 7),new Date(2011, 7, 8)]; // just some dates.
$('#whatever').datepicker({
beforeShowDay: function(date) {
// check if date is in your array of dates
if($.inArray(date, your_dates)) {
// if it is return the following.
return [true, 'css-class-to-highlight', 'tooltip text'];
} else {
// default
return [true, '', ''];
}
}
});
и теперь вы можете добавить стиль, чтобы выделить дату
<style>
.css-class-to-highlight{
background-color: #ff0;
}
</style>
Ответ 3
Нашел самый проголосовавший ответ, который не работает. Обновленный код немного, чтобы заставить его работать. $.inArray() в основном ищет indexOf(). Также мы не можем сравнивать две даты непосредственно для равенства.
Ссылка: Сравните две даты с JavaScript
function inArrayDates(needle, haystack){
var found = 0;
for (var i=0, len=haystack.length;i<len;i++) {
if (haystack[i].getTime() == needle.getTime()) return i;
found++;
}
return -1;
}
И обновите принятую функцию как
if(inArrayDates(date, markDates) != -1) {
return [true, 'selected-highlight', 'tooltip here'];
} else {
return [true, '', ''];
}
Ответ 4
http://jqueryui.com/demos/datepicker/#event-beforeShowDay
Вы сравниваете параметр date в beforeShowDay с датами, которые вы получили в своем массиве, и если есть совпадение, вы возвращаете массив, как определено в ссылке выше.
В массиве, который вы возвращаете из beforeShowDay, второй элемент используется для установки имени класса, которое будет использоваться в дате, затем вы можете использовать css для установки стилей для этого класса.
Ответ 5
Даты в JS являются экземплярами объекта Date
, поэтому вы не можете правильно проверить, соответствуют ли даты с помощью ==
или ===
.
Простое решение:
var your_dates = [
new Date(2017, 4, 25),
new Date(2017, 4, 23)
];
$( "#some_selector" ).datepicker({
beforeShowDay: function(date) {
are_dates_equal = d => d.getTime() === date.getTime();
if(your_dates.some(are_dates_equal)) {
return [true, 'ui-state-active', ''];
}
return [true, '', ''];
}
})