Bisakah Datepicker jQuery UI dibuat untuk menonaktifkan hari Sabtu dan Minggu (dan hari libur)?

193

Saya menggunakan datepicker untuk memilih hari janji. Saya sudah menetapkan rentang tanggal hanya untuk bulan berikutnya. Itu bekerja dengan baik. Saya ingin mengecualikan hari Sabtu dan Minggu dari pilihan yang tersedia. Bisakah ini dilakukan? Jika ya, bagaimana caranya?

cletus
sumber

Jawaban:

243

Ada beforeShowDayopsi, yang membutuhkan fungsi untuk dipanggil untuk setiap tanggal, menghasilkan true jika tanggal diizinkan atau salah jika tidak. Dari dokumen:


sebelumShowDay

Fungsi mengambil tanggal sebagai parameter dan harus mengembalikan array dengan [0] sama dengan benar / salah yang menunjukkan apakah tanggal ini dapat dipilih dan 1 sama dengan nama kelas CSS atau '' untuk presentasi default. Itu dipanggil untuk setiap hari di datepicker sebelum itu ditampilkan.

Tampilkan beberapa hari libur nasional di datepicker.

$(".selector").datepicker({ beforeShowDay: nationalDays})   

natDays = [
  [1, 26, 'au'], [2, 6, 'nz'], [3, 17, 'ie'],
  [4, 27, 'za'], [5, 25, 'ar'], [6, 6, 'se'],
  [7, 4, 'us'], [8, 17, 'id'], [9, 7, 'br'],
  [10, 1, 'cn'], [11, 22, 'lb'], [12, 12, 'ke']
];

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'];
      }
    }
  return [true, ''];
}

Ada satu fungsi bawaan, yang disebut noWeekends, yang mencegah pemilihan hari akhir pekan.

$(".selector").datepicker({ beforeShowDay: $.datepicker.noWeekends })

Untuk menggabungkan keduanya, Anda bisa melakukan sesuatu seperti (dengan asumsi nationalDaysfungsi dari atas):

$(".selector").datepicker({ beforeShowDay: noWeekendsOrHolidays})   

function noWeekendsOrHolidays(date) {
    var noWeekend = $.datepicker.noWeekends(date);
    if (noWeekend[0]) {
        return nationalDays(date);
    } else {
        return noWeekend;
    }
}

Pembaruan : Perhatikan bahwa pada jQuery UI 1.8.19, opsi beforeShowDay juga menerima paremeter ketiga opsional, popup tooltip

Adam Bellaire
sumber
2
Terima kasih untuk ini, tidak dapat menemukan metode ini di dokumen mana pun.
Neil Aitken
2
solusi terbaik terutama seperti seberapa singkat penjelasan Anda. @Neil
Kaushik Gopal
Dengan ini saya mendapatkan Uncaught TypeError: Cannot read property 'noWeekends' of undefinedfungsi hari nasional berfungsi seperti yang diharapkan
LewisJWright
Jika Anda sudah instantiated, Anda dapat memperbarui opsi: $ ('# selector'). datepicker ('option', 'beforeShowDay', $ .datepicker.noWeekends);
Marcaum54
42

Jika Anda tidak ingin akhir pekan muncul sama sekali, cukup:

CSS

th.ui-datepicker-week-end,
td.ui-datepicker-week-end {
    display: none;
}

sumber
1
Untuk menyembunyikan hari sepenuhnya tetapi tunjukkan header dan ruang kosong:td.ui-datepicker-week-end { visibility: hidden; }
Vael Victus
Ini adalah cara yang sangat rapi untuk mengecualikan akhir pekan.
itsdarrylnorris
Terima kasih, sangat bagus :)
Fox
26

Jawaban-jawaban ini sangat membantu. Terima kasih.

Kontribusi saya di bawah ini menambahkan sebuah array di mana beberapa hari dapat menghasilkan false (kami tutup setiap hari Selasa, Rabu dan Kamis). Dan saya menggabungkan tanggal tertentu ditambah tahun dan fungsi tanpa akhir pekan.

Jika Anda ingin libur akhir pekan, tambahkan [Sabtu], [Minggu] ke array closedDays.

$(document).ready(function(){

    $("#datepicker").datepicker({
        beforeShowDay: nonWorkingDates,
        numberOfMonths: 1,
        minDate: '05/01/09',
        maxDate: '+2M',
        firstDay: 1
    });

    function nonWorkingDates(date){
        var day = date.getDay(), Sunday = 0, Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5, Saturday = 6;
        var closedDates = [[7, 29, 2009], [8, 25, 2010]];
        var closedDays = [[Monday], [Tuesday]];
        for (var i = 0; i < closedDays.length; i++) {
            if (day == closedDays[i][0]) {
                return [false];
            }

        }

        for (i = 0; i < closedDates.length; i++) {
            if (date.getMonth() == closedDates[i][0] - 1 &&
            date.getDate() == closedDates[i][1] &&
            date.getFullYear() == closedDates[i][2]) {
                return [false];
            }
        }

        return [true];
    }




});
orolo
sumber
3
Anda bisa mengedit jawaban lama Anda, alih-alih memposting yang baru - sertakan keduanya dalam jawaban yang sama, mengingat betapa miripnya mereka, atau cukup hapus yang lama dan tinggalkan versi yang lebih baik
Yi Jiang
13

Solusi di sini yang disukai semua orang tampaknya sangat intens ... secara pribadi saya pikir ini jauh lebih mudah untuk melakukan sesuatu seperti ini:

       var holidays = ["12/24/2012", "12/25/2012", "1/1/2013", 
            "5/27/2013", "7/4/2013", "9/2/2013", "11/28/2013", 
            "11/29/2013", "12/24/2013", "12/25/2013"];

       $( "#requestShipDate" ).datepicker({
            beforeShowDay: function(date){
                show = true;
                if(date.getDay() == 0 || date.getDay() == 6){show = false;}//No Weekends
                for (var i = 0; i < holidays.length; i++) {
                    if (new Date(holidays[i]).toString() == date.toString()) {show = false;}//No Holidays
                }
                var display = [show,'',(show)?'':'No Weekends or Holidays'];//With Fancy hover tooltip!
                return display;
            }
        });

Dengan cara ini teman kencan Anda bisa dibaca manusia. Tidak terlalu berbeda, itu lebih masuk akal bagi saya dengan cara ini.

Pembersih
sumber
6

Versi kode ini akan membuat Anda mendapatkan tanggal liburan dari basis data sql dan menonaktifkan tanggal yang ditentukan dalam UI Datepicker


$(document).ready(function (){
  var holiDays = (function () {
    var val = null;
    $.ajax({
        'async': false,
        'global': false,
        'url': 'getdate.php',
        'success': function (data) {
            val = data;
        }
    });
    return val;
    })();
  var natDays = holiDays.split('');

  function nationalDays(date) {
    var m = date.getMonth();
    var d = date.getDate();
    var y = date.getFullYear();

    for (var i = 0; i  natDays.length-1; i++) {
    var myDate = new Date(natDays[i]);
      if ((m == (myDate.getMonth())) && (d == (myDate.getDate())) && (y == (myDate.getFullYear())))
      {
        return [false];
      }
    }
    return [true];
  }

  function noWeekendsOrHolidays(date) {
    var noWeekend = $.datepicker.noWeekends(date);
      if (noWeekend[0]) {
        return nationalDays(date);
      } else {
        return noWeekend;
    }
  }
  $(function() { 
    $("#shipdate").datepicker({
      minDate: 0,
      dateFormat: 'DD, d MM, yy',
      beforeShowDay: noWeekendsOrHolidays,
      showOn: 'button',
      buttonImage: 'images/calendar.gif', 
      buttonImageOnly: true
     });
  });
});

Buat Database dalam sql dan beri Anda tanggal liburan dalam format MM / DD / YYYY sebagai Varchar Masukkan konten di bawah ini dalam file getdate.php


[php]
$sql="SELECT dates FROM holidaydates";
$result = mysql_query($sql);
$chkdate = $_POST['chkdate'];
$str='';
while($row = mysql_fetch_array($result))
{
$str .=$row[0].'';
}
echo $str;
[/php]

Selamat Coding !!!! :-)

neo
sumber
5

Anda dapat menggunakan fungsi noWeekends untuk menonaktifkan pilihan akhir pekan

  $(function() {
     $( "#datepicker" ).datepicker({
     beforeShowDay: $.datepicker.noWeekends
     });
     });
Malith
sumber
4
$("#selector").datepicker({ beforeShowDay: highlightDays });

...

var dates = [new Date("1/1/2011"), new Date("1/2/2011")];

function highlightDays(date) {

    for (var i = 0; i < dates.length; i++) {
        if (date - dates[i] == 0) {
            return [true,'', 'TOOLTIP'];
        }
    }
    return [false];

}
Etienne Dupuis
sumber
2

Dalam versi ini, bulan, hari, dan tahun menentukan hari mana yang akan diblokir di kalender.

$(document).ready(function (){
  var d         = new Date();
  var natDays   = [[1,1,2009],[1,1,2010],[12,31,2010],[1,19,2009]];

  function nationalDays(date) {
    var m = date.getMonth();
    var d = date.getDate();
    var y = date.getFullYear();

    for (i = 0; i < natDays.length; i++) {
      if ((m == natDays[i][0] - 1) && (d == natDays[i][1]) && (y == natDays[i][2]))
      {
        return [false];
      }
    }
    return [true];
  }
  function noWeekendsOrHolidays(date) {
    var noWeekend = $.datepicker.noWeekends(date);
      if (noWeekend[0]) {
        return nationalDays(date);
      } else {
        return noWeekend;
    }
  }
  $(function() { 
    $(".datepicker").datepicker({

      minDate: new Date(d.getFullYear(), 1 - 1, 1),
      maxDate: new Date(d.getFullYear()+1, 11, 31),

      hideIfNoPrevNext: true,
      beforeShowDay: noWeekendsOrHolidays,
     });
  });
});
Christopher Altman
sumber
0

untuk menonaktifkan hari Anda dapat melakukan sesuatu seperti ini. <input type="text" class="form-control datepicker" data-disabled-days="1,3">di mana 1 adalah Senin dan 3 adalah Rabu

Jorgeeadan
sumber
0

Dalam versi Bootstrap 3 terbaru (bootstrap-datepicker.js) beforeShowDaymengharapkan hasil dalam format ini:

{ enabled: false, classes: "class-name", tooltip: "Holiday!" }

Atau, jika Anda tidak peduli dengan CSS dan tooltip maka cukup mengembalikan boolean falseuntuk membuat tanggal tidak dipilih.

Juga, tidak ada $.datepicker.noWeekends, jadi Anda perlu melakukan sesuatu seperti ini:

var HOLIDAYS = {  // Ontario, Canada holidays
    2017: {
        1: { 1: "New Year's Day"},
        2: { 20: "Family Day" },
        4: { 17: "Easter Monday" },
        5: { 22: "Victoria Day" },
        7: { 1: "Canada Day" },
        8: { 7: "Civic Holiday" },
        9: { 4: "Labour Day" },
        10: { 9: "Thanksgiving" },
        12: { 25: "Christmas", 26: "Boxing Day"}
    }
};

function filterNonWorkingDays(date) {
    // Is it a weekend?
    if ([ 0, 6 ].indexOf(date.getDay()) >= 0)
        return { enabled: false, classes: "weekend" };
    // Is it a holiday?
    var h = HOLIDAYS;
    $.each(
        [ date.getYear() + 1900, date.getMonth() + 1, date.getDate() ], 
        function (i, x) {
            h = h[x];
            if (typeof h === "undefined")
                return false;
        }
    );
    if (h)
        return { enabled: false, classes: "holiday", tooltip: h };
    // It's a regular work day.
    return { enabled: true };
}

$("#datePicker").datepicker({ beforeShowDay: filterNonWorkingDays });
Kaspia Canuck
sumber
0

Untuk hari Sabtu dan Minggu Anda bisa melakukan hal seperti ini

             $('#orderdate').datepicker({
                               daysOfWeekDisabled: [0,6]
                 });
Hiren Makwana
sumber