2011-07-28 26 views
17

Jak mogę użyć beforeShowDay do podświetlania dni w jQuery UI datepicker. Mam dnia następującego tablicęPodświetl daty w 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 
) 
+0

Co chcesz dokładnie osiągnąć? –

+2

Chcę zaznaczyć powyższe daty. –

Odpowiedz

19

I rozwiązać problem przy użyciu

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

     } 
    }); 
}); 
+1

+1, potrzebna inna opcja: Dodawanie linku do aktywowanej daty, aby przejść do opisu zdarzenia, na przykład –

+0

Możesz uniknąć tych zmiennych y, m oraz d, jeśli porównujesz daty otrzymujące ich wartości przed i używając licznika i: ​​if (data .valueOf() == disabledDays [i] .valueOf()) {... – Rober

+1

@Nisanth: Twoja odpowiedź robi niepotrzebną pętlę. Nie musisz robić 'for (i = 0; i

0

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

porównać parametru data w beforeShowDay z datami masz w swojej tablicy, a jeśli nie jest to mecz wrócisz tablicę, jak określono w link powyżej.

W tablicy, z której powracasz przed opcjąShowDay, drugi element służy do ustawienia nazwy klasy, która będzie używana w dniu, możesz wtedy użyć css do ustawienia stylów dla tej klasy.

33

Zapoznaj się z dokumentacją.

beforeShowDay Funkcja przyjmuje datę jako parametr i nie może powrócić tablicę [0] równa prawda/fałsz wskazującą, czy termin ten jest do wyboru, [1] równa nazwą klasy CSS (e) lub "" dla domyślnej prezentacji, oraz [2] opcjonalne wyskakujące okienko narzędziowe dla tej daty. Jest wywoływana dla każdego dnia w datepicker, zanim zostanie wyświetlona.

To oznacza, że ​​trzeba utworzyć funkcję, która będzie miała datę i zwraca tablicę parametrów, których wartości są:

  1. logiczna - wskazuje, czy data może być wybrany
  2. ciąg - nazwa klasy css, który będzie aplikowany do dnia
  3. String - opcjonalnej podpowiedzi kontekstowe tej dacie

tutaj jest exa MPle:

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, '', '']; 
     } 
    } 
}); 

a teraz można dodać styl, aby podświetlić datę

<style> 
    .css-class-to-highlight{ 
     background-color: #ff0; 
    } 
</style> 
+0

czy mógłbyś zrobić z demo skrzypce, proszę? –

+0

Nie sądzę, że można porównać takie daty w JS. 'new Date (1) == new Data (1) jest fałszywa' – mxmissile

+0

Próbowałem twój kod, aby podświetlić daty. Ale nie działa z tablicą dynamiczną. Jednak działa tak, jak opisałeś. Jakieś pomysły? Podkreśla wszystkie daty w kalendarzu. – Superman

2

Znaleziono najbardziej głosowało odpowiedź nie działa. Zaktualizowano trochę kod, aby działał. $ .inArray() najczęściej szuka indexOf(). Również nie możemy porównać dwóch dat bezpośrednio dla równości. referencyjny: Compare two dates with 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; 
} 

i aktualizować przyjętej funkcję

if(inArrayDates(date, markDates) != -1) { 
      return [true, 'selected-highlight', 'tooltip here']; 
      } else { 
      return [true, '', '']; 
      } 
0

Daty w JS są instancjami obiektu Date, więc nie można sprawdzić, czy prawidłowo terminy są równe użyciu == lub ===.

Proste rozwiązanie:

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, '', '']; 
    } 
})