it-swarm.com.ru

Выделите даты в 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
)
17
Nisanth Kumar

Я решил проблему с помощью

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];

        }
    });
});
19
Nisanth Kumar

Посмотрите на документацию. 

beforeShowDay Функция принимает дату в качестве параметра и должна возвращать массив с [0], равным true/false, указывающим, является ли эта дата доступной для выбора, [1] равна названию (ям) класса CSS или ' 'для презентации по умолчанию и [2] необязательная всплывающая подсказка для этой даты. Он вызывается для каждого дня в средстве выбора даты перед его отображением.

Это означает, что вам нужно создать функцию, которая будет принимать дату и возвращать массив параметров, значения которых:

  1. логический - указывает, можно ли выбрать дату
  2. строка - имя класса css, который будет применен к дате
  3. строка - необязательная всплывающая подсказка на эту дату

вот пример:

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>
33
Nikita Ignatov

Нашел самый голосующий ответ не работает. Немного обновил код, чтобы он заработал. $ .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, '', ''];
          }
2
Karan Sharma

Даты в 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, '', ''];
    }
})
1
Mark Mishyn

http://jqueryui.com/demos/datepicker/#event-beforeShowDay

Вы сравниваете параметр date в beforeShowDay с датами, которые вы получили в своем массиве, и, если есть совпадение, вы возвращаете массив, как определено в ссылке выше.

В массиве, который вы возвращаете из beforeShowDay, второй элемент используется для установки имени класса, который будет использоваться на дату, затем вы можете использовать css для установки стилей для этого класса.

0
manubkk