2つの入力ボックスでjQuery Datepickerウィジェットを使用しています。1つは "From"日付用で、2つ目は "To"日付。私は jQuery Datepicker機能デモ を2つの入力ボックスを相互に動作させるための基礎として使用していますが、これらの追加の制限を追加できる必要があります。
日付の範囲は2008年12月1日より前にすることはできません
"To"日付は今日より遅くすることはできません
"From"日付が選択されると、 "To"日付「From」の日付から7日以内の範囲内にのみ指定できます
"To"日付が最初に選択された場合、 "From"日付は、 "To"日付の7日前までの範囲内にのみ指定できます(12月1日が最初に選択可能な日付です)
上記のすべてを連携させることはできません。
要約すると、12月1日から今日までの最大7日間の範囲を選択できるようになりたいと思います(これは12月1日に投稿しているので、当面は今日のみになります)。
これまでの私のコード
$(function () {
$('#txtStartDate, #txtEndDate').datepicker(
{
showOn: "both",
beforeShow: customRange,
dateFormat: "dd M yy",
firstDay: 1,
changeFirstDay: false
});
});
function customRange(input)
{
return {
minDate: (input.id == "txtStartDate" ? new Date(2008, 12 - 1, 1) : null),
minDate: (input.id == "txtEndDate" ? $("#txtStartDate").datepicker("getDate") : null),
maxDate: (input.id == "txtStartDate" ? $("#txtEndDate").datepicker("getDate") : null)
};
}
7日間の範囲制限がありません。また、 "To"の日付選択が2008年12月1日以前または今日以降になりません。どんな助けでも大歓迎です、ありがとう。
あなたの助けに感謝しますベン、私はあなたの投稿に基づいてこれを考え出しました。これで完成し、見事に機能します!
ここにWorking Demoがあります。コードを表示するには、URLに/ editを追加します
以下の完全なコード-
$(function ()
{
$('#txtStartDate, #txtEndDate').datepicker({
showOn: "both",
beforeShow: customRange,
dateFormat: "dd M yy",
firstDay: 1,
changeFirstDay: false
});
});
function customRange(input) {
var min = new Date(2008, 11 - 1, 1), //Set this to your absolute minimum date
dateMin = min,
dateMax = null,
dayRange = 6; // Set this to the range of days you want to restrict to
if (input.id === "txtStartDate") {
if ($("#txtEndDate").datepicker("getDate") != null) {
dateMax = $("#txtEndDate").datepicker("getDate");
dateMin = $("#txtEndDate").datepicker("getDate");
dateMin.setDate(dateMin.getDate() - dayRange);
if (dateMin < min) {
dateMin = min;
}
}
else {
dateMax = new Date; //Set this to your absolute maximum date
}
}
else if (input.id === "txtEndDate") {
dateMax = new Date; //Set this to your absolute maximum date
if ($("#txtStartDate").datepicker("getDate") != null) {
dateMin = $("#txtStartDate").datepicker("getDate");
var rangeMax = new Date(dateMin.getFullYear(), dateMin.getMonth(),dateMin.getDate() + dayRange);
if(rangeMax < dateMax) {
dateMax = rangeMax;
}
}
}
return {
minDate: dateMin,
maxDate: dateMax
};
}
私はパーティーに少し遅れていることに気付きましたが、ここで実際のサンプルコードを修正しました。特定の最大日付と最小日付を設定する必要はありませんでした。日付範囲が重複することは望ましくなかったので、お互いに設定できるようにしました。
jQuery(function() {
jQuery('#calendardatetime_required_to, #calendardatetime_required_from').datepicker('option', {
beforeShow: customRange
});
});
function customRange(input) {
if (input.id == 'calendardatetime_required_to') {
return {
minDate: jQuery('#calendardatetime_required_from').datepicker("getDate")
};
} else if (input.id == 'calendardatetime_required_from') {
return {
maxDate: jQuery('#calendardatetime_required_to').datepicker("getDate")
};
}
}
(私の日付ピッカーは、スクリプトのさらに上で既に初期化されていますが、それは単なるデフォルト設定です。)
私はそれが必要なことをするようです:)
here を参照してください。
さて、これはどうですか:
function customRange(input)
{
var min = new Date(2008, 12 - 1, 1);
var dateMin = min;
var dateMax = null;
if (input.id == "txtStartDate" && $("#txtEndDate").datepicker("getDate") != null)
{
dateMax = $("#txtEndDate").datepicker("getDate");
dateMin = $("#txtEndDate").datepicker("getDate");
dateMin.setDate(dateMin.getDate() - 7);
if (dateMin < min)
{
dateMin = min;
}
}
else if (input.id == "txtEndDate")
{
dateMax = new Date();
if ($("#txtStartDate").datepicker("getDate") != null)
{
dateMin = $("#txtStartDate").datepicker("getDate");
dateMax = $("#txtStartDate").datepicker("getDate");
dateMax.setDate(dateMax.getDate() + 7);
}
}
return {
minDate: dateMin,
maxDate: dateMax
};
}
これは、すべての要件を満たした最高の方法です(...)
TxtStartDateの開始日は、2回目のinput.idのチェック時に2番目のminDateがnullに設定されているため機能しません。また、maxDateはtxtStartDateではなくtxtEndDateをチェックする必要があります。これを試して:
function customRange(input)
{
var mDate = (input.id == "txtStartDate" ? new Date(2008, 12 - 1, 1) : $("#txtStartDate").datepicker("getDate"));
return {
minDate: mDate,
maxDate: (input.id == "txtEndDate" ? $("#txtStartDate").datepicker("getDate").getDate() + 5 : null)
};
}
「+ 7」ではなく「+ 5」の理由はわかりませんが、0を追加すると、選択した日のプラス次の日付範囲を選択できます。
RangeSelectを使用して、2つではなく1つのコントロールを使用することを検討してください。
目的を達成するには、onSelectリスナーを追加し、datepicker( "option", settings )
を呼び出して設定を変更する必要があると思います。
よくある問題だと思うものに対する解決策を何度も掘り下げた後に思いついた解決策を次に示します。これは、互換性のある日の共有入力範囲の周りで入力を効果的に「バウンス」します。意味-2つのフィールドがある場合、どちらか一方を使用して他方を制約することができ、他方は必要に応じて元のものを再定義できます。これの目標は、2つのフィールドの間に有限の範囲の日数(または月数など)があることを常に保証することです。この特定の例では、いずれかのフィールドで何かを選択できるようになるまでの時間も制限されます(3か月など)。
$("#startdate").datepicker({
minDate: '+5',
maxDate: '+3M',
changeMonth: true,
showAnim: 'blind',
onSelect: function(dateText, inst){
// Capture the Date from User Selection
var oldDate = new Date(dateText);
var newDate = new Date(dateText);
// Compute the Future Limiting Date
newDate.setDate(newDate.getDate()+5);
// Set the Widget Properties
$("#enddate").datepicker('option', 'minDate', oldDate);
$("#enddate").datepicker('option', 'maxDate', newDate);
}
});
$("#enddate").datepicker({
minDate: '+5',
maxDate: '+3M',
changeMonth: true,
showAnim: 'blind',
onSelect: function(dateText, inst){
// Capture the Date from User Selection
var endDate = new Date(dateText);
var startDate = new Date(dateText);
// Compute the Future Limiting Date
startDate.setDate(startDate.getDate()-5);
// Set the Widget Properties
$("#startdate").datepicker('option', 'minDate', startDate);
$("#startdate").datepicker('option', 'maxDate', endDate);
}
});
これは私がそれを使用する方法です:
function customRange(input)
{
var min = new Date();
return {
minDate: ((input.id == "txtStartDate") ? min : (input.id == "txtEndDate" ? $("#txtStartDate").datepicker("getDate") : null)),
maxDate: (input.id == "txtStartDate" ? $("#txtEndDate").datepicker("getDate") : null)
};
}
これは私がやった方法です。 Jquery UI Webサイトからソースを取得し、それを変更して制約を追加しました。
$(document).ready(function ()
{
var dates = $('#StartDate, #EndDate').datepicker({
minDate: new Date(2008, 11, 1),
maxDate: "+0D",
dateFormat: "dd M yy",
changeMonth: true,
changeYear: true,
onSelect: function (selectedDate)
{
var option = this.id == "StartDate" ? "minDate" : "maxDate",
instance = $(this).data("datepicker"),
date = $.datepicker.parseDate(
instance.settings.dateFormat ||
$.datepicker._defaults.dateFormat,
selectedDate, instance.settings);
var edate;
var otherOption;
var d;
if (option == "minDate")
{
otherOption = "maxDate";
d = date.getDate() + 7;
}
else if (option == "maxDate")
{
otherOption = "minDate";
d = date.getDate() - 7;
}
var m = date.getMonth();
var y = date.getFullYear();
edate = new Date(y, m, d);
dates.not(this).datepicker("option", option, date);
dates.not(this).datepicker("option", otherOption, edate);
}
});
});
最初のアイデア: http://jqueryui.com/demos/datepicker/#date-range
注:日付をリセット/クリアするオプションも必要です(つまり、ユーザーが「開始日」を選択した場合、「終了日」はユーザーが「終了日」を選択した場合に「開始日」を選択すると、開始日も制限されます。ユーザーが別の「開始日」を選択できるようにするには、明確なオプションが必要です。