JQuery UI Datepicker. Wyłącz tablicę dat

84

Próbowałem znaleźć rozwiązanie mojego problemu z datownikiem interfejsu Jquery i nie mam szczęścia. Oto, co próbuję zrobić ...

Mam aplikację, w której wykonuję skomplikowane PHP, aby zwrócić tablicę JSON z datami, które chcę ZABLOKOWAĆ z Jquery UI Datepicker. Zwracam tę tablicę:

["2013-03-14","2013-03-15","2013-03-16"]

Czy nie ma prostego sposobu, aby po prostu powiedzieć: zablokować te daty w selektorze dat?

Przeczytałem dokumentację interfejsu użytkownika i nie widzę nic, co by mi pomogło. Czy ktoś ma jakieś pomysły?

Daniel White
źródło

Odpowiedzi:

208

Możesz użyć beforeShowDay, aby to zrobić

Poniższy przykład wyłącza daty od 14 marca 2013 do 16 marca 2013

var array = ["2013-03-14","2013-03-15","2013-03-16"]

$('input').datepicker({
    beforeShowDay: function(date){
        var string = jQuery.datepicker.formatDate('yy-mm-dd', date);
        return [ array.indexOf(string) == -1 ]
    }
});

Demo: Fiddle

Arun P Johny
źródło
1
Raczej widzę, dokąd z tym zmierzasz. Jak jednak uwzględniłbym mój zestaw dat.
Daniel White,
14
ŁAŁ. Jesteś cholernym geniuszem. Nie wiem, dlaczego nie ma tego już w postach przepełnienia stosu dla tego pytania, skoro zadawano je milion razy. Wszystkie powyższe przykłady są zbyt skomplikowane, to jest ładne i proste. 5 gwiazdek. Dzięki.
Daniel White,
pobrałem kod jqueryui.com/download/ ... ale kiedy integruję powyższy kod, nie działa, proszę o pomoc
Sam
Jeden głos za to nie wystarczy. Niektórzy ludzie komplikują sprawy o wiele bardziej, niż powinny. Dziękuję bardzo za prosty, działający fragment. Bardzo przydatne.
0112
4
Jeśli chcesz również wykluczyć weekendy poza tymi niestandardowymi datami, zamień wiersz zwrotu na następujący:return array.indexOf(string) != -1 ? [false] : $.datepicker.noWeekends(date);
Pablo SG Pacheco
20

IE 8 nie ma funkcji indexOf, więc zamiast tego użyłem jQuery inArray.

$('input').datepicker({
    beforeShowDay: function(date){
        var string = jQuery.datepicker.formatDate('yy-mm-dd', date);
        return [$.inArray(string, array) == -1];
    }
});
Tripex
źródło
6
@ChristopherStrydom zdziwiłbyś się, jak wiele osób nadal z niego korzysta.
euther
3
Dzieje się tak, ponieważ IE8 jest najnowszą przeglądarką IE, która będzie działać pod WinXP (SP3).
JosephK
Obsługuje jednak funkcję indexOf () w ciągu znaków w celu znalezienia pozycji podłańcucha w tym ciągu.
Wezy
9

Jeśli chcesz również zablokować niedziele (lub inne dni), a także tablicę dat, używam tego kodu:

jQuery(function($){

    var disabledDays = [
       "27-4-2016", "25-12-2016", "26-12-2016",
       "4-4-2017", "5-4-2017", "6-4-2017", "6-4-2016", "7-4-2017", "8-4-2017", "9-4-2017"
    ];

   //replace these with the id's of your datepickers
   $("#id-of-first-datepicker,#id-of-second-datepicker").datepicker({
      beforeShowDay: function(date){
         var day = date.getDay();
         var string = jQuery.datepicker.formatDate('d-m-yy', date);
         var isDisabled = ($.inArray(string, disabledDays) != -1);

         //day != 0 disables all Sundays
         return [day != 0 && !isDisabled];
      }
   });
});   
To magia
źródło
1
$('input').datepicker({
   beforeShowDay: function(date){
       var string = jQuery.datepicker.formatDate('yy-mm-dd', date);
       return [ array.indexOf(string) == -1 ]
   }
});
user38156
źródło
1

beforeShowDate nie działało dla mnie, więc poszedłem do przodu i opracowałem własne rozwiązanie:

$('#embeded_calendar').datepicker({
               minDate: date,
                localToday:datePlusOne,
               changeDate: true,
               changeMonth: true,
               changeYear: true,
               yearRange: "-120:+1",
               onSelect: function(selectedDateFormatted){

                     var selectedDate = $("#embeded_calendar").datepicker('getDate');

                    deactivateDates(selectedDate);
                   }

           });


              var excludedDates = [ "10-20-2017","10-21-2016", "11-21-2016"];

              deactivateDates(new Date());

            function deactivateDates(selectedDate){
                setTimeout(function(){ 
                      var thisMonthExcludedDates = thisMonthDates(selectedDate);
                      thisMonthExcludedDates = getDaysfromDate(thisMonthExcludedDates);
                       var excludedTDs = page.find('td[data-handler="selectDay"]').filter(function(){
                           return $.inArray( $(this).text(), thisMonthExcludedDates) >= 0
                       });

                       excludedTDs.unbind('click').addClass('ui-datepicker-unselectable');
                   }, 10);
            }

            function thisMonthDates(date){
              return $.grep( excludedDates, function( n){
                var dateParts = n.split("-");
                return dateParts[0] == date.getMonth() + 1  && dateParts[2] == date.getYear() + 1900;
            });
            }

            function getDaysfromDate(datesArray){
                  return  $.map( datesArray, function( n){
                    return n.split("-")[1]; 
                });
             }
Roberto Rodriguez
źródło
Czy możemy zrobić to samo na dateRangePicker ??
Sunil Rawat
1

W przypadku DD-MM-RR użyj tego kodu:

var tablica = [„03-03-2017”, „03-10-2017”, „03-25-2017”]

$('#datepicker').datepicker({
    beforeShowDay: function(date){
    var string = jQuery.datepicker.formatDate('dd-mm-yy', date);
    return [ array.indexOf(string) == -1 ]
    }
});

function highlightDays(date) {
    for (var i = 0; i < dates.length; i++) {
    if (new Date(dates[i]).toString() == date.toString()) {
        return [true, 'highlight'];
    }
}
return [true, ''];
}
Dierig Patrick
źródło
Czy to możliwe dla daterangepicker, chcę wyłączyć tablicę dat w selektorze dat?
Sunil Rawat
Czy możesz zdefiniować swoje pytanie?
Dierig Patrick
Mam selektor zakresu dat, który przypuszczam: 01.01.2017 - 31.03.2017. Chcę podkreślić niektóre daty i tablicę niestandardowych dat między tym zakresem. w kalendarzu zakresu dat. $ dates = ['02 /01/2017 ', '03/01/2017'... do] tych dat. jest możliwe?
Sunil Rawat
podobnie jak w datepicker możemy użyć do tego celu funkcji beforeShowDay, co jest w date-range-picker: daterangepicker.com
Sunil Rawat
1

Jeśli chcesz wyłączyć określone daty w jquery datepicker, oto proste demo dla Ciebie.

<script type="text/javascript">
    var arrDisabledDates = {};
    arrDisabledDates[new Date("08/28/2017")] = new Date("08/28/2017");
    arrDisabledDates[new Date("12/23/2017")] = new Date("12/23/2017");
    $(".datepicker").datepicker({
        dateFormat: "dd/mm/yy",
        beforeShowDay: function (date) {
            var day = date.getDay(),
                    bDisable = arrDisabledDates[date];
            if (bDisable)
                return [false, "", ""]
        }
    });
</script>
Vimal Patel
źródło