8

私はこのマルチデートピッカーを使用しています。週末が選択されない日付範囲モードを使用することは可能ですか?

私はすでに週末がブロックされ、ユーザーが5日だけを選択できるマルチデートピッカーを実行しましたが、これは私の目標ではありません。この機能が欲しい:ユーザーが特定の日付をクリックすると、週末の日なしで範囲内の5日が強調表示されます...

以下の私のコード:

jQuery('#deliverydate').multiDatesPicker({
   minDate:0,
   beforeShowDay: noWeekendsOrHolidays,
   mode: 'daysRangeWithoutWeekends', 
   autoselectRange: [0,5],
   numberOfMonths: 2            
});

今、私は自分の解決策にかなり近づいています:

有効にする必要があるすべての日と、日の範囲に週末がある場合に選択する必要があるすべての新しい日を数えます。

multidatepicker.js daysRangeWithoutWeekendsに新しいメソッドを追加し、すべての新しい日と無効な日をカウントします。次に、2つのforeachループを使用して、新しい日付を無効および有効にします。

$.each(all_removed_dates, function(index, value) { 
    methods.removeDates.call(obj, value);
});

$.each(all_new_dates, function(index, value) { 
     methods.addDates.call(obj,value);
});

値はDateオブジェクトです。最初のforeachループは完全に機能し、強調表示された週末をすべて削除しますが、2番目のループは機能しません。エラーが返されます:

Empty array of dates received.

なぜなのかご存知ですか?

あなたは私の目標が何であるかを理解していないすべてのために: 週末のないmultidatepicker範囲

21.6.2012の日付21.6。、22.6、25.6、26.6。、27.6をクリックすると、週末のない範囲で5日を選択する必要があります。選択する必要があります。

上位のコードを使用すると、週末に強調表示されたクラスを削除できますが、2番目のループ(コードを上位に表示)が26.6.2012と27.6.2012を強調表示しない理由がわかりません。

4

5 に答える 5

0

これを試してみませんか

methods.addDates.call(obj,all_new_dates);

これの代わりに

$.each(all_new_dates, function(index, value) { 
     methods.addDates.call(obj,value);
});
于 2012-06-13T16:03:27.193 に答える
0

おそらく、配列の内容をループして変更するだけでうまくいくでしょうか?

if (this.multiDatesPicker.mode === 'daysRangeWithoutWeekends' && this.multiDatesPicker.dates.picked.length > 0) {
    var i = 0,
        saturdayFound = false,
        sundayFound = false;
    for (i = 0; i < this.multiDatesPicker.dates.picked.length; i += 1) {
        if (this.multiDatesPicker.dates.picked[i].getDay() === 6) {
            this.multiDatesPicker.dates.picked[i] = this.multiDatesPicker.dates.picked[i].addDays(2); //make it Monday
            saturdayFound = true;
        }
        if (this.multiDatesPicker.dates.picked[i].getDay() === 0) {
            this.multiDatesPicker.dates.picked[i] = this.multiDatesPicker.dates.picked[i].addDays(1); //make it Monday
            sundayFound = true;
        }
        if (saturdayFound || sundayFound) {
            //weekend exists before this element in the array
            if ((this.multiDatesPicker.dates.picked[i].getDay() > 0) || (this.multiDatesPicker.dates.picked[i].getDay() < 6)) {
                //weekday found following weekend
                if (saturdayFound) {
                    this.multiDatesPicker.dates.picked[i] = this.multiDatesPicker.dates.picked[i].addDays(1); //add a day to offset for Saturday
                }
                if (sundayFound) {
                    this.multiDatesPicker.dates.picked[i] = this.multiDatesPicker.dates.picked[i].addDays(1); //add a day to offset for Sunday
                }
            }
        }
    }
    all_new_dates = this.multiDatesPicker.dates.picked;
}
于 2012-06-18T13:57:27.093 に答える
0

次のコードで daysRange ケースを変更します

ケース「daysRange」:

this.multiDatesPicker.dates[type] = []; // deletes all picked/disabled 
var end = this.multiDatesPicker.autoselectRange[1];
var begin = this.multiDatesPicker.autoselectRange[0];
if(end < begin) { // switch
    end = this.multiDatesPicker.autoselectRange[0];
    begin = this.multiDatesPicker.autoselectRange[1];
}

var i1=begin;
var i2=begin;
while(i1<end){
    var tep= new Date(methods.sumDays(date, i2));
    if(tep.getDay()!=0 && tep.getDay()!=6){
        methods.addDates.call(this, methods.sumDays(date, i2), type);
        i1++;
    }
    i2++;
}
于 2015-08-19T05:37:07.210 に答える
0

まず第一に、これは一般的な解決策ではありません。一般的な解決策を考える時間がありませんでした。私の解決策は、週末のない範囲で 5 日間を選択する必要がある場合です。

jquery-ui.multidatepicker.js の onSelect メソッド (cca. 81 行) に次を追加します。

if(this.multiDatesPicker.mode == 'daysRangeWithoutWeekends'  && this.multiDatesPicker.dates.picked.length > 0){
      var i = 0,
      last

      if(this.multiDatesPicker.dates.picked[0].getDay() == 2){  //thusday
           i = 1
           //remove sunday
           all_removed_dates.push(this.multiDatesPicker.dates.picked[4])
      } 
      if(this.multiDatesPicker.dates.picked[0].getDay() == 3){//wednesday
           i = 2 
           //remove sunday and saturday 
           all_removed_dates.push(this.multiDatesPicker.dates.picked[3],                      this.multiDatesPicker.dates.picked[4])
      }
      if(this.multiDatesPicker.dates.picked[0].getDay() == 4){ //thursday
           i=2
           all_removed_dates.push(this.multiDatesPicker.dates.picked[2], this.multiDatesPicker.dates.picked[3])                                   
      }  
      if(this.multiDatesPicker.dates.picked[0].getDay() == 5){ //friday
           i=2
           all_removed_dates.push(this.multiDatesPicker.dates.picked[1], this.multiDatesPicker.dates.picked[2])                                   
      } 

      last = this.multiDatesPicker.dates.picked.pop()
      this.multiDatesPicker.dates.picked.push(last)

      if(this.multiDatesPicker.dates.picked[0].getDay() == 2){ //thusday
            //if we have thusday we add 2 day after last day so last day in range was saturday and we add 2 day and we get date for monday
            var new_date = new Date(last.getFullYear(), last.getMonth(), last.getDate() + 2)
            all_new_dates.push(new_date)
      }else{
          //if there were sunday and saturday in range we add 2 days to last date in range
          for(var j = 1; j <= i; j++){
                var new_date = new Date(last.getFullYear(), last.getMonth(), last.getDate() + j)
                all_new_dates.push(new_date)
          }
      }

      var obj = this
      //remove sunday and saturday 
      $.each(all_removed_dates, function(index, value) { 
          methods.removeDates.call(obj, value);
      });
      //add new days                                  
      $.each(all_new_dates, function(index, value) { 
          methods.add_new_date.call(obj,value);
      });                             
}

jquery-ui.multidatepicker.js の toogleDate メソッド (cca. 431 行) で、ケース「daysRange」の前に次を追加します。

case 'daysRangeWithoutWeekends':

ケース「daysRange」の前に、jquery-ui.multidatepicker.js の setMode(cca. 473row) に次を追加します。

case 'daysRangeWithoutWeekends':

カレンダーは次のように初期化されます:

jQuery('#deliverydate').multiDatesPicker({
   minDate:0,
   beforeShowDay: noWeekendsOrHolidays,
   mode: 'daysRangeWithoutWeekends', 
   autoselectRange: [0,5],
   numberOfMonths: 2            
});

誰かが一般的なアルゴリズムを作ったら、それを共有してください =)

于 2012-06-13T10:24:13.683 に答える