Obecnie pracuję nad selektorem daty Jquery, w którym święta są wyłączone i wszystkie niedziele, z wyjątkiem pierwszej w każdym miesiącu. Próbowałem trochę pobawić się kodem i dowiedziałem się, jak wyłączyć wszystkie niedziele i święta, ale nie mogę zrozumieć, jak włączyć pierwszą niedzielę każdego miesiąca.

Obecnie mój kod wygląda tak:

<script type="text/javascript">
        (function(){

            var natDays = [[12, 24],[12, 25], [1,1], [12, 31]];
            var daysToDisable = [0];
            function nationalDays(date) {
                for (i = 0; i < natDays.length; i++) {
                    if (date.getMonth() == natDays[i][0] - 1
                    && date.getDate() == natDays[i][1]) {
                        return [false, natDays[i][2] + '_day'];
                    }
                }
                for (i = 0; i < daysToDisable.length; i++) {
                    if ($.inArray(day, daysToDisable) != -1) {
                        return [false];
                    }
                }
                return [true];
            }   
            // Datepicker
            $('#datepicker').datepicker({
                inline: true,
                firstDay: 1,
                changeYear: true,
                changeMonth: true,
                beforeShowDay: nationalDays,
            });
        });
</script>
1
Casper O 9 lipiec 2011, 02:50

2 odpowiedzi

Najlepsza odpowiedź

Logicznie rzecz biorąc, pierwsza niedziela miesiąca przypada zawsze w dniu lub przed siódmą, a druga (i kolejne) niedziela przypada po siódmej.

function nationalDays(date) {
    for (i = 0; i < natDays.length; i++) {
        if (date.getMonth() == natDays[i][0] - 1 && date.getDate() == natDays[i][1]) {
            return [false, natDays[i][2] + '_day'];
        }
    }
    if (date.getDate() > 7 && $.inArray(date.getDay(), daysToDisable) != -1)
        return [false];
    }
    return [true];
}

Sugerowałbym również zmianę struktury tablicy natDays na tablicę płaską, aby przyspieszyć wyszukiwanie. Dla prefiksów klas (które nie są ustawione w twoim przykładzie) możesz użyć dodatkowej tablicy z pasującymi indeksami. Twoja ostateczna funkcja wyglądałaby tak:

var natDays = ["12-24", "12-25", "1-1", "12-31"];
var classPrefixes = ["", "", "", ""];
var daysToDisable = [0];

function nationalDays(date) {
    var index = $.inArray((date.getMonth() + 1) + "-" + date.getDate(), natDays);
    if (index != -1) {
        return [false, classPrefixes[index] + '_day'];
    }
    if (date.getDate() > 7 && $.inArray(date.getDay(), daysToDisable) != -1)
        return [false];
    }
    return [true];
}
1
DarthJDG 9 lipiec 2011, 03:26
Z jakiegoś powodu Twój kod nie działał po wyjęciu z pudełka, ale udało mi się zmienić strukturę natDays. Również nie wiem, dlaczego nie natrafiłem na rozwiązanie w pierwszą niedzielę każdego miesiąca, to całkiem logiczne! Może byłam po prostu zbyt zmęczona po 20 godzinach pracy :)
 – 
Casper O
9 lipiec 2011, 11:29

Metoda, której szukasz, to date.getDay(), która zwróci liczbę od 0 do 6, gdzie 0 oznacza niedzielę.

function nationalDays(date) {
    if(date.getDay() == 0) {
        // do stuff...
0
ElonU Webdev 9 lipiec 2011, 03:00