jQuery UI DatePickerで月年のみを表示する


374

アプリ全体にカレンダーを表示するためにjQuery日付ピッカーを使用しています。カレンダーではなく月と年(2010年5月)を表示するためにそれを使用できるかどうか知りたいですか?


16
だからあなたは月のピッカーが欲しいですか?
義母

jQueryUI DatePickerを使用していますか?
wpjmurray 2010

はい。jQueryUI DatePicker
2010

6
これはあなたの質問への回答ではありませんが、これで十分に見えます。eternicode.github.io
Ruben

bootstrap-datepickerは廃止されたリポジトリのようで、問題を修正するための目立った作業なしに問題が
山積みになっ

回答:


424

これがハックです(.htmlファイル全体で更新されています)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>
    <link rel="stylesheet" type="text/css" media="screen" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/base/jquery-ui.css">
    <script type="text/javascript">
        $(function() {
            $('.date-picker').datepicker( {
            changeMonth: true,
            changeYear: true,
            showButtonPanel: true,
            dateFormat: 'MM yy',
            onClose: function(dateText, inst) { 
                $(this).datepicker('setDate', new Date(inst.selectedYear, inst.selectedMonth, 1));
            }
            });
        });
    </script>
    <style>
    .ui-datepicker-calendar {
        display: none;
    }
    </style>
</head>
<body>
    <label for="startDate">Date :</label>
    <input name="startDate" id="startDate" class="date-picker" />
</body>
</html>

上記の例のjsfiddleを編集します:http ://jsfiddle.net/DBpJe/7755/

編集2 [完了]ボタンをクリックした場合にのみ、入力ボックスに月の年の値を追加します。また、入力ボックスの値を削除することもできます。これは、上記のフィールドでは不可能です http://jsfiddle.net/DBpJe/5103/

EDIT 3は 、rexwolfのソリューションダウンに基づいてBetter Solutionを更新しました。
http://jsfiddle.net/DBpJe/5106


14
「setDate」を呼び出すと、一部のブラウザでピッカーが再び開きます。これを防ぐには、ピッカーを無効にしてから有効にします。$(this).datepicker( 'disable'); $(this).datepicker( 'setDate'、new Date(year1、month1、1)); $(this).datepicker( 'enable');
SvenSönnichsen

1
@Svenはここに代替案があります:$(this).val($.datepicker.formatDate('MM yy', new Date(year, month, 1)));
ThiamTeck 2011年

1
このソリューションを使用しようとしていますが、datepickerでgetDateを使用すると、今日のみ返されます。調子はどう?
supertopi 2012年

1
ほとんどの例では、ページ自体でインラインスタイルを使用しています。同じページに何らかの方法で複数のカレンダー(たとえば、それぞれ異なる設定のカレンダー)が必要な場合、これは問題になります。:私のようなの.cssファイルにスタイルを追加することを好む #ui-datepicker-div.noCalendar .ui-datepicker-calendar, #ui-datepicker-div.noCalendar .ui-datepicker-header a {display: none;} #ui-datepicker-div.noCalendar .ui-datepicker-header .ui-datepicker-title{width: 100%; margin: 0;} :そして、動作を操作するためにJavascriptを使用して$("#ui-datepicker-div").addClass('noCalendar');
poweratom

1
上記の例では、テキストボックスをクリアしたい場合はできません。誰かが私を助けてくれますか?
Bik

83

このコードは私にとって完璧に機能しています:

<script type="text/javascript">
$(document).ready(function()
{   
    $(".monthPicker").datepicker({
        dateFormat: 'MM yy',
        changeMonth: true,
        changeYear: true,
        showButtonPanel: true,

        onClose: function(dateText, inst) {
            var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
            var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
            $(this).val($.datepicker.formatDate('MM yy', new Date(year, month, 1)));
        }
    });

    $(".monthPicker").focus(function () {
        $(".ui-datepicker-calendar").hide();
        $("#ui-datepicker-div").position({
            my: "center top",
            at: "center bottom",
            of: $(this)
        });
    });
});
</script>

<label for="month">Month: </label>
<input type="text" id="month" name="month" class="monthPicker" />

出力は次のとおりです。

ここに画像の説明を入力してください


このカレンダーに値を設定するにはどうすればよいですか。
Rafik malek

62

@ベンケーラー、それは首長です!日付の選択の単一のインスタンスを複数回使用しても期待どおりに機能するように、マイナーな変更を加えました。この変更を行わないと、日付が正しく解析されず、以前に選択した日付が強調表示されません。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>
    <link rel="stylesheet" type="text/css" media="screen" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/base/jquery-ui.css">
    <script type="text/javascript">
    $(function() {
        $('.date-picker').datepicker( {
            changeMonth: true,
            changeYear: true,
            showButtonPanel: true,
            dateFormat: 'MM yy',
            onClose: function(dateText, inst) { 
                var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
                var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
                $(this).datepicker('setDate', new Date(year, month, 1));
            },
            beforeShow : function(input, inst) {
                var datestr;
                if ((datestr = $(this).val()).length > 0) {
                    year = datestr.substring(datestr.length-4, datestr.length);
                    month = jQuery.inArray(datestr.substring(0, datestr.length-5), $(this).datepicker('option', 'monthNamesShort'));
                    $(this).datepicker('option', 'defaultDate', new Date(year, month, 1));
                    $(this).datepicker('setDate', new Date(year, month, 1));
                }
            }
        });
    });
    </script>
    <style>
    .ui-datepicker-calendar {
        display: none;
        }
    </style>
</head>
<body>
    <label for="startDate">Date :</label>
    <input name="startDate" id="startDate" class="date-picker" />
</body>
</html>

この答えはほぼ正しいです。ただし、日付が既に選択されている場合に正しい月を選択するには、MMをMに変更する必要がありました。
Chazaq

18

上記の答えはかなり良いです。私の唯一の不満は、一度設定すると値をクリアできないことです。また、extend-jquery-like-a-pluginアプローチを好みます。

これは私にとって完璧に機能します:

$.fn.monthYearPicker = function(options) {
    options = $.extend({
        dateFormat: "MM yy",
        changeMonth: true,
        changeYear: true,
        showButtonPanel: true,
        showAnim: ""
    }, options);
    function hideDaysFromCalendar() {
        var thisCalendar = $(this);
        $('.ui-datepicker-calendar').detach();
        // Also fix the click event on the Done button.
        $('.ui-datepicker-close').unbind("click").click(function() {
            var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
            var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
            thisCalendar.datepicker('setDate', new Date(year, month, 1));
        });
    }
    $(this).datepicker(options).focus(hideDaysFromCalendar);
}

次に、次のように呼び出します。

$('input.monthYearPicker').monthYearPicker();

2
最後に、これは機能しないので、私はこれに反対票を投じています。onSelectおよび/またはonChangeMonthYearおよび/またはonCloseイベントが発生しないか、正しい値を受け取らないか、オーバーライドされた場合、ウィジェットが機能しなくなるためです。
knocte 2014

10
<style>
.ui-datepicker table{
    display: none;
}

<script type="text/javascript">
$(function() {
    $( "#manad" ).datepicker({
        changeMonth: true,
        changeYear: true,
        showButtonPanel: true,
        dateFormat: 'yy-mm',
        onClose: function(dateText, inst) { 
            var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
            var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
            $(this).datepicker('setDate', new Date(year, month, 1));
        },
        beforeShow : function(input, inst) {
            if ((datestr = $(this).val()).length > 0) {
                actDate = datestr.split('-');
                year = actDate[0];
                month = actDate[1]-1;
                $(this).datepicker('option', 'defaultDate', new Date(year, month));
                $(this).datepicker('setDate', new Date(year, month));
            }
        }
    });
});

これは問題を解決します=)しかし、私はtimeFormat yyyy-mmが欲しかったです

FF4だけで試した


JQueryの「yy」は4桁の年です。これがあなたが望むものであれば、あなたはそれを達成したばかりです。
パヴェルDyda


8

これが私が思いついたものです。追加のスタイルブロックを必要とせずにカレンダーを非表示にし、入力をクリックすると値をクリアできないという問題に対処するためのクリアボタンを追加します。また、同じページの複数のピッカーでうまく動作します。

HTML:

<input type='text' class='monthpicker'>

JavaScript:

$(".monthpicker").datepicker({
    changeMonth: true,
    changeYear: true,
    dateFormat: "yy-mm",
    showButtonPanel: true,
    currentText: "This Month",
    onChangeMonthYear: function (year, month, inst) {
        $(this).val($.datepicker.formatDate('yy-mm', new Date(year, month - 1, 1)));
    },
    onClose: function(dateText, inst) {
        var month = $(".ui-datepicker-month :selected").val();
        var year = $(".ui-datepicker-year :selected").val();
        $(this).val($.datepicker.formatDate('yy-mm', new Date(year, month, 1)));
    }
}).focus(function () {
    $(".ui-datepicker-calendar").hide();
}).after(
    $("<a href='javascript: void(0);'>clear</a>").click(function() {
        $(this).prev().val('');
    })
);

5

2つのフィールド(開始と終了)に月/年のピッカーが必要でした。一方を選択すると、もう一方のフィールドに最大/最小が設定されました...航空券の日付を選択しています。最大と最小の設定に問題がありました...他のフィールドの日付が消去されます。上記の投稿のいくつかのおかげで...私は最終的にそれを理解しました。オプションと日付は非常に特定の順序で設定する必要があります。

完全なソリューションについては、次のフィドルを参照してください。月/年ピッカー@ JSFiddle

コード:

var searchMinDate = "-2y";
var searchMaxDate = "-1m";
if ((new Date()).getDate() <= 5) {
    searchMaxDate = "-2m";
}
$("#txtFrom").datepicker({
    dateFormat: "M yy",
    changeMonth: true,
    changeYear: true,
    showButtonPanel: true,
    showAnim: "",
    minDate: searchMinDate,
    maxDate: searchMaxDate,
    showButtonPanel: true,
    beforeShow: function (input, inst) {
        if ((datestr = $("#txtFrom").val()).length > 0) {
            var year = datestr.substring(datestr.length - 4, datestr.length);
            var month = jQuery.inArray(datestr.substring(0, datestr.length - 5), "#txtFrom").datepicker('option', 'monthNamesShort'));
        $("#txtFrom").datepicker('option', 'defaultDate', new Date(year, month, 1));
                $("#txtFrom").datepicker('setDate', new Date(year, month, 1));
            }
        },
        onClose: function (input, inst) {
            var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
            var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
            $("#txtFrom").datepicker('option', 'defaultDate', new Date(year, month, 1));
            $("#txtFrom").datepicker('setDate', new Date(year, month, 1));
            var to = $("#txtTo").val();
            $("#txtTo").datepicker('option', 'minDate', new Date(year, month, 1));
            if (to.length > 0) {
                var toyear = to.substring(to.length - 4, to.length);
                var tomonth = jQuery.inArray(to.substring(0, to.length - 5), $("#txtTo").datepicker('option', 'monthNamesShort'));
                $("#txtTo").datepicker('option', 'defaultDate', new Date(toyear, tomonth, 1));
                $("#txtTo").datepicker('setDate', new Date(toyear, tomonth, 1));
            }
        }
    });
    $("#txtTo").datepicker({
        dateFormat: "M yy",
        changeMonth: true,
        changeYear: true,
        showButtonPanel: true,
        showAnim: "",
        minDate: searchMinDate,
        maxDate: searchMaxDate,
        showButtonPanel: true,
        beforeShow: function (input, inst) {
            if ((datestr = $("#txtTo").val()).length > 0) {
                var year = datestr.substring(datestr.length - 4, datestr.length);
                var month = jQuery.inArray(datestr.substring(0, datestr.length - 5), $("#txtTo").datepicker('option', 'monthNamesShort'));
                $("#txtTo").datepicker('option', 'defaultDate', new Date(year, month, 1));
                $("#txtTo").datepicker('setDate', new Date(year, month, 1));
            }
        },
        onClose: function (input, inst) {
            var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
            var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
            $("#txtTo").datepicker('option', 'defaultDate', new Date(year, month, 1));
            $("#txtTo").datepicker('setDate', new Date(year, month, 1));
            var from = $("#txtFrom").val();
            $("#txtFrom").datepicker('option', 'maxDate', new Date(year, month, 1));
            if (from.length > 0) {
                var fryear = from.substring(from.length - 4, from.length);
                var frmonth = jQuery.inArray(from.substring(0, from.length - 5), $("#txtFrom").datepicker('option', 'monthNamesShort'));
                $("#txtFrom").datepicker('option', 'defaultDate', new Date(fryear, frmonth, 1));
                $("#txtFrom").datepicker('setDate', new Date(fryear, frmonth, 1));
            }

        }
    });

上記のように、これをスタイルブロックに追加します。

.ui-datepicker-calendar { display: none !important; }

5

私は上記の良い答えの多くを組み合わせてこれに到達しました:

    $('#payCardExpireDate').datepicker(
            {
                dateFormat: "mm/yy",
                changeMonth: true,
                changeYear: true,
                showButtonPanel: true,
                onClose: function(dateText, inst) { 
                    var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
                    var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
                    $(this).datepicker('setDate', new Date(year, month, 1)).trigger('change');
                },
                beforeShow : function(input, inst) {
                    if ((datestr = $(this).val()).length > 0) {
                        year = datestr.substring(datestr.length-4, datestr.length);
                        month = datestr.substring(0, 2);
                        $(this).datepicker('option', 'defaultDate', new Date(year, month-1, 1));
                        $(this).datepicker('setDate', new Date(year, month-1, 1));
                    }
                }
            }).focus(function () {
                $(".ui-datepicker-calendar").hide();
                $("#ui-datepicker-div").position({
                    my: "center top",
                    at: "center bottom",
                    of: $(this)
                });
            });

これは機能していることが証明されていますが、多くのバグに直面しているため、datepickerのいくつかの場所でパッチを適用する必要がありました。

if($.datepicker._get(inst, "dateFormat") === "mm/yy")
{
    $(".ui-datepicker-calendar").hide();
}

patch1:in _showDatepicker:非表示を滑らかにする;

patch2:_checkOffset:月のピッカーの位置を修正します(そうでない場合、フィールドがブラウザーの下部にある場合、オフセットチェックはオフになります)。

patch3:_hideDatepickerのonClose内:それ以外の場合、日付フィールドを閉じると、非常に煩わしい非常に短い期間点滅します。

私の修正はそれほど良いものではないことはわかっていますが、今のところ問題なく機能しています。それが役に立てば幸い。


JUstはこの行をbeforeShow:{inst.dpDiv.addClass( 'month_year_datepicker')}に追加します。点滅する日付が停止します:)。また、.focusは不要になると思います
Parag

5

もう1つの単純なソリューションを追加する

 $(function() {
    $('.monthYearPicker').datepicker({
        changeMonth: true,
        changeYear: true,
        showButtonPanel: true,
        dateFormat: 'M yy'
    }).focus(function() {
        var thisCalendar = $(this);
        $('.ui-datepicker-calendar').detach();
        $('.ui-datepicker-close').click(function() {
var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
thisCalendar.datepicker('setDate', new Date(year, month, 1));
        });
    });
});

http://jsfiddle.net/tmnasim/JLydp/
機能

  • 月/年のみを表示
  • [完了]ボタンをクリックしたときにのみ、入力ボックスに月の年の値を追加します
  • 「完了」をクリックしても「再開」動作しない
    ------------------------------------機能する
    別のソリューション同じページの日付ピッカーと月ピッカーの場合:(IEで前のボタンを複数クリックするバグも回避してください。フォーカス機能を使用すると発生する可能性があります)
    JSフィドルリンク

4

それは私だけですか、それともIE(8)で正常に機能していませんか?完了をクリックすると日付が変わりますが、実際にページのどこかをクリックして入力フィールドにフォーカスを失うまで、日付ピッカーが再び開きます...

私はこれを解決するために探しています。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>
    <link rel="stylesheet" type="text/css" media="screen" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/base/jquery-ui.css">
<script type="text/javascript">
$(function() {
    $('.date-picker').datepicker( {
        changeMonth: true,
        changeYear: true,
        showButtonPanel: true,
        dateFormat: 'MM yy',
        onClose: function(dateText, inst) { 
            var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
            var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
            $(this).datepicker('setDate', new Date(year, month, 1));
        }
    });
});
</script>
<style>
.ui-datepicker-calendar {
    display: none;
    }
</style>
</head>
<body>
    <label for="startDate">Date :</label>
    <input name="startDate" id="startDate" class="date-picker" />
</body>
</html>

1
$(this).datepicker( 'disable'); $(this).datepicker( 'setDate'、new Date(year、month、1)); $(this).datepicker( 'enable'); 問題を解決します。
トムヴァンスクール

1
これは答えではありません
sisharp 2013

4

あなたが月のピッカーを探しているなら、このjquery.mtz.monthpickerを試してください

これでうまくいきました。

options = {
    pattern: 'yyyy-mm', // Default is 'mm/yyyy' and separator char is not mandatory
    selectedYear: 2010,
    startYear: 2008,
    finalYear: 2012,
    monthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
};

$('#custom_widget').monthpicker(options);

リンクが死んでいる。このサイトにアクセスできません| lucianocosta.infoのサーバーDNSアドレスが見つかりませんでした。
Pang

1
更新されたリンクは次のとおり
Sebastian S.

更新されたリンクも壊れています。
ナッシュ

4

他の多くの人と同じように、私はこれを実行しようとする多くの問題に遭遇しました、そして投稿されたソリューションの組み合わせ、そして結局それを完璧にするための大きなハックが私にソリューションもたらしました。

私が試したこのスレッドの他のソリューションの問題:

  1. 日付ピッカーで新しい日付を選択すると、他の日付ピッカーの(内部)日付も変更されるため、他の日付ピッカーを再度開いた(または日付を取得しようとした)場合、割り当てられた入力に表示されている日付とは異なる日付になります-フィールド。
  2. 日付ピッカーは、再度開いたときに日付を「記憶」しません。
  3. 日付を調整するコードは部分文字列を使用したため、すべての形式と互換性がありませんでした。
  4. 「My monthpicker」は、値が変更されるたびではなく、入力フィールドを閉じるときにのみ変更しました。
  5. 日付の形式が正しくない入力文字列を入力し、日付ピッカーの[閉じる]をクリックすると、入力フィールドが正しく更新されません。
  6. 日を表示しない月ピッカーと同じページに、日を表示する通常の日付ピッカーを配置できません。

これらの問題をすべて解決する方法がようやく見つかりました。最初の4つは、内部コードで日付ピッカーと月ピッカーを参照する方法に注意し、ピッカーを手動で更新するだけで修正できます。これは、下部のインスタンス化の例で確認できます。5番目の問題は、datepicker関数にカスタムコードを追加することで解決できます。

注:通常の日付ピッカーの最初の3つの問題を修正するために、次の月ピッカースクリプトを使用する必要はありません。この投稿の下部にある日付ピッカーのインスタンス化スクリプトを使用するだけです。

ここで、monthpickerを使用して最後の問題を修正するには、datepickerとmonthpickerを分離する必要があります。数少ないjQuery-UIの月間ピッカーアドオンの1つを入手できますが、ローカリゼーションの柔軟性や機能に欠けているもの、アニメーションのサポートに欠けているものがあります。日付ピッカーコードから「自分」を転がそう!これにより、日を表示することなく、日付ピッカーのすべての機能を備えた完全に機能する月ピッカーが得られます。

以下で説明する方法を使用して、jQuery-UI v1.11.1コードで、monthpicker js-scriptとそれに付随するCSS-scriptを提供しました。これらのコードスニペットをそれぞれ2つの新しいファイル、monthpicker.jsとmonthpicker.cssにコピーするだけです。

日付ピッカーを月ピッカーに変換するというかなり単純なプロセスについてお読みになりたい場合は、最後のセクションまでスクロールしてください。


次に、日付ピッカーと月ピッカーをページに追加します。

以下のjavascriptコードスニペットは、ページ上の複数の日付ピッカーまたは月ピッカー、あるいはその両方で動作し、前述の問題はありません。通常、「$(this)」を使用して修正されました。たくさん :)

最初のスクリプトは通常の日付ピッカー用で、2番目のスクリプトは「新しい」月ピッカー用です。

入力フィールドをクリアする要素を作成できるコメントアウトされた.afterは、Paul Richardsの答えから盗まれました。

私は月間ピッカーで「MM yy」形式を、日付ピッカーでは「yy-mm-dd」形式を使用していますが、これはすべての形式完全に互換性があるため、どちらでも自由に使用できます。「dateFormat」オプションを変更するだけです。標準オプション「showButtonPanel」、「showAnim」、および「yearRange」はもちろんオプションであり、希望に合わせてカスタマイズできます。


日付ピッカーを追加する

日付ピッカーのインスタンス化。 これは90年前から現在に至る。特にdefaultDate、minDate、maxDateオプションを設定した場合は、入力フィールドを正しく保つのに役立ちますが、そうしなくても処理できます。選択した任意のdateFormatで動作します。

        $('#MyDateTextBox').datepicker({
            dateFormat: 'yy-mm-dd',
            changeMonth: true,
            changeYear: true,
            showButtonPanel: true,
            showMonthAfterYear: true,
            showWeek: true,
            showAnim: "drop",
            constrainInput: true,
            yearRange: "-90:",
            minDate: new Date((new Date().getFullYear() - 90), new Date().getMonth(), new Date().getDate()),
            maxDate: new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()),
            defaultDate: new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()),

            onClose: function (dateText, inst) {
                // When onClose is called after we have clicked a day (and not clicked 'Close' or outside the datepicker), the input-field is automatically
                // updated with a valid date-string. They will always pass, because minDate and maxDate are already enforced by the datepicker UI.
                // This try is to catch and handle the situations, where you open the datepicker, and manually type in an invalid date in the field,
                // and then close the datepicker by clicking outside the datepicker, or click 'Close', in which case no validation takes place.
                try {
                    // If datepicker can parse the date using our formatstring, the instance will automatically parse
                    // and apply it for us (after the onClose is done).
                    // If the input-string is invalid, 'parseDate' will throw an exception, and go to our catch.
                    // If the input-string is EMPTY, then 'parseDate' will NOT throw an exception, but simply return null!
                    var typedDate = $.datepicker.parseDate($(this).datepicker('option', 'dateFormat'), $(this).val());

                    // typedDate will be null if the entered string is empty. Throwing an exception will force the datepicker to
                    // reset to the last set default date.
                    // You may want to just leave the input-field empty, in which case you should replace 'throw "No date selected";' with 'return;'
                    if (typedDate == null)throw "No date selected";

                    // We do a manual check to see if the date is within minDate and maxDate, if they are defined.
                    // If all goes well, the default date is set to the new date, and datepicker will apply the date for us.
                    var minDate = $(this).datepicker("option", "minDate");
                    var maxDate = $(this).datepicker("option", "maxDate");
                    if (minDate !== null && typedDate < minDate) throw "Date is lower than minDate!";
                    if (maxDate !== null && typedDate > maxDate) throw "Date is higher than maxDate!";

                    // We update the default date, because the date seems valid.
                    // We do not need to manually update the input-field, as datepicker has already done this automatically.
                    $(this).datepicker('option', 'defaultDate', typedDate);
                }
                catch (err) {
                    console.log("onClose: " + err);
                    // Standard behavior is that datepicker does nothing to fix the value of the input field, until you choose
                    // a new valid date, by clicking on a day.
                    // Instead, we set the current date, as well as the value of the input-field, to the last selected (and
                    // accepted/validated) date from the datepicker, by getting its default date. This only works, because
                    // we manually change the default date of the datepicker whenever a new date is selected, in both 'beforeShow'
                    // and 'onClose'.
                    var date = $(this).datepicker('option', 'defaultDate');
                    $(this).val($.datepicker.formatDate($(this).datepicker('option', 'dateFormat'), date));
                    $(this).datepicker('setDate', date);
                }
            },

            beforeShow: function (input, inst) {
                // beforeShow is particularly irritating when initializing the input-field with a date-string.
                // The date-string will be parsed, and used to set the currently selected date in the datepicker.
                // BUT, if it is outside the scope of the minDate and maxDate, the text in the input-field is not
                // automatically updated, only the internal selected date, until you choose a new date (or, because
                // of our onClose function, whenever you click close or click outside the datepicker).
                // We want the input-field to always show the date that is currently chosen in our datepicker,
                // so we do some checks to see if it needs updating. This may not catch ALL cases, but these are
                // the primary ones: invalid date-format; date is too early; date is too late.
                try {
                    // If datepicker can parse the date using our formatstring, the instance will automatically parse
                    // and apply it for us (after the onClose is done).
                    // If the input-string is invalid, 'parseDate' will throw an exception, and go to our catch.
                    // If the input-string is EMPTY, then 'parseDate' will NOT throw an exception, but simply return null!
                    var typedDate = $.datepicker.parseDate($(this).datepicker('option', 'dateFormat'), $(this).val());

                    // typedDate will be null if the entered string is empty. Throwing an exception will force the datepicker to
                    // reset to the last set default date.
                    // You may want to just leave the input-field empty, in which case you should replace 'throw "No date selected";' with 'return;'
                    if (typedDate == null)throw "No date selected";

                    // We do a manual check to see if the date is within minDate and maxDate, if they are defined.
                    // If all goes well, the default date is set to the new date, and datepicker will apply the date for us.
                    var minDate = $(this).datepicker("option", "minDate");
                    var maxDate = $(this).datepicker("option", "maxDate");
                    if (minDate !== null && typedDate < minDate) throw "Date is lower than minDate!";
                    if (maxDate !== null && typedDate > maxDate) throw "Date is higher than maxDate!";

                    // We update the input-field, and the default date, because the date seems valid.
                    // We also manually update the input-field, as datepicker does not automatically do this when opened.
                    $(this).val($.datepicker.formatDate($(this).datepicker('option', 'dateFormat'), typedDate));
                    $(this).datepicker('option', 'defaultDate', typedDate);
                }
                catch (err) {
                    // Standard behavior is that datepicker does nothing to fix the value of the input field, until you choose
                    // a new valid date, by clicking on a day.
                    // We want the same behavior when opening the datepicker, so we set the current date, as well as the value
                    // of the input-field, to the last selected (and accepted/validated) date from the datepicker, by getting
                    // its default date. This only works, because we manually change the default date of the datepicker whenever
                    // a new date is selected, in both 'beforeShow' and 'onClose', AND have a default date set in the datepicker options.
                    var date = $(this).datepicker('option', 'defaultDate');
                    $(this).val($.datepicker.formatDate($(this).datepicker('option', 'dateFormat'), date));
                    $(this).datepicker('setDate', date);
                }
            }
        })
    //.after( // this makes a link labeled "clear" appear to the right of the input-field, which clears the text in it
    //    $("<a href='javascript: void(0);'>clear</a>").click(function() {
    //        $(this).prev().val('');
    //    })
    //)
    ;

月ピッカーを追加する

monthpickersを使用するページに、monthpicker.jsファイルとmonthpicker.cssファイルを含めます。

モンピッカーのインスタンス化 この月ピッカーから取得した値は、常に選択した月の最初の日です。現在の月から始まり、100年前から10年後までの範囲です。

    $('#MyMonthTextBox').monthpicker({
        dateFormat: 'MM yy',
        changeMonth: true,
        changeYear: true,
        showMonthAfterYear: true,
        showAnim: "drop",
        constrainInput: true,
        yearRange: "-100Y:+10Y",
        minDate: new Date(new Date().getFullYear() - 100, new Date().getMonth(), 1),
        maxDate: new Date((new Date().getFullYear() + 10), new Date().getMonth(), 1),
        defaultDate: new Date(new Date().getFullYear(), new Date().getMonth(), 1),

        // Monthpicker functions
        onClose: function (dateText, inst) {
            var date = new Date(inst.selectedYear, inst.selectedMonth, 1);
            $(this).monthpicker('option', 'defaultDate', date);
            $(this).monthpicker('setDate', date);
        },

        beforeShow: function (input, inst) {
            if ($(this).monthpicker("getDate") !== null) {
                // Making sure that the date set is the first of the month.
                if($(this).monthpicker("getDate").getDate() !== 1){
                    var date = new Date(inst.selectedYear, inst.selectedMonth, 1);
                    $(this).monthpicker('option', 'defaultDate', date);
                    $(this).monthpicker('setDate', date);
                }
            } else {
                // If the date is null, we reset it to the defaultDate. Make sure that the defaultDate is always set to the first of the month!
                $(this).monthpicker('setDate', $(this).monthpicker('option', 'defaultDate'));
            }
        },
        // Special monthpicker function!
        onChangeMonthYear: function (year, month, inst) {
            $(this).val($.monthpicker.formatDate($(this).monthpicker('option', 'dateFormat'), new Date(year, month - 1, 1)));
        }
    })
    //.after( // this makes a link labeled "clear" appear to the right of the input-field, which clears the text in it
    //    $("<a href='javascript: void(0);'>clear</a>").click(function() {
    //        $(this).prev().val('');
    //    })
    //)
    ;

それでおしまい! それだけで、月間ピッカーを作成できます。

私はこれでjsfiddleを動作させることができないようですが、それは私のASP.NET MVCプロジェクトで私のために働いています。日付ピッカーをページに追加するために通常行っていることを行い、上記のスクリプトを組み込んでください。セレクター($( "#MyMonthTextBox")を意味します)を適切なものに変更することもできます。

これが誰かの役に立つことを願っています。

追加の日付および月ピッカー設定用のペーストビンへのリンク:

  1. モンスピッカーは月の最終日に取り組んでいます。今月のピッカーから取得する日付は、常に月の最終日になります。

  2. 2つの共同の月間ピッカー。'start'は月の最初に、 'end'は月の最後に働きます。どちらも互いに制限されているため、「開始」で選択した月の前にある「終了」の月を選択すると、「開始」が「終了」と同じ月に変更されます。およびその逆。オプション:「開始」の月を選択すると、「終了」の「minDate」がその月に設定されます。この機能を削除するには、onCloseの1行をコメント化します(コメントを読んでください)。

  3. 2つの共同日付ピッカー。どちらも互いに制限されているため、「開始」で選択した日付より前の「終了」の日付を選択すると、「開始」が「終了」と同じ月に変更されます。およびその逆。オプション:「開始」の日付を選択すると、「終了」の「minDate」がその日付に設定されます。この機能を削除するには、onCloseの1行をコメント化します(コメントを読んでください)。


DatePickerをMonthPickerに変更する方法

datepickerに関連するjquery-ui-1.11.1.jsからすべてのJavaScriptコードを取得し、新しいjs-fileに貼り付けて、次の文字列を置き換えました。

  • "datepicker" ==> "monthpicker"
  • "日付ピッカー" ==> "月ピッカー"
  • "日付ピッカー" ==> "月ピッカー"
  • "日付ピッカー" ==> "月ピッカー"

次に、ui-datepicker-calendar div(他のソリューションがCSSを使用して非表示にするdiv)全体を作成するforループの一部を削除しました。これは、_generateHTML:関数(inst)にあります。

次のような行を見つけます。

"</div><table class='ui-datepicker-calendar'><thead>" +

divの終了タグの後から、それが言う行まで(含まないで)、すべてをマークします。

drawMonth++;

何かを閉じる必要があるので、今は不幸になります。以前のdiv-tagを閉じた後、これを追加します。

";

これでコードがうまく継ぎ合わされます。これは、最終的に何をすべきかを示すコードスニペットです。

...other code...

calender += "<div class='ui-monthpicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
                (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") +
                (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") +
                this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
                    row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
                "</div>";
            drawMonth++;
            if (drawMonth > 11) {
                drawMonth = 0;
                drawYear++;
            }

...other code...

次に、datepickersに関連するコードをjquery-ui.cssから新しいCSSファイルにコピーして貼り付け、次の文字列を置き換えました。

  • "datepicker" ==> "monthpicker"

3

datepickerのためにjQueryUI.comを掘り下げた後、これが私の結論とあなたの質問への回答です。

最初に、私はあなたの質問にノーと言うでしょう。jQueryUI datepickerを使用して、月と年のみを選択することはできません。サポートされていません。そのためのコールバック関数はありません。

しかし、あなたはそれをハックして表示することができます、cssを使用して日などを非表示にすることで、月と年のみます。日付を選択するには、日付をクリックする必要があるため、まだ意味がないと思います。

別の日付ピッカーを使用する必要があると言えます。ロジャーが示唆したように。


3

日付ピッカーと月ピッカーが混在する問題がありました。そのように解決しました。

    $('.monthpicker').focus(function()
    {
    $(".ui-datepicker-calendar").show();
    }).datepicker( {
        changeMonth: true,
        changeYear: true,
        showButtonPanel: true,
        dateFormat: 'MM/yy',
        create: function (input, inst) { 

         },
        onClose: function(dateText, inst) { 
            var month = 1+parseInt($("#ui-datepicker-div .ui-datepicker-month :selected").val());           
            var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();

        }
    });

3

誰かが複数のカレンダーについてもそれを望んでいる場合、jquery uiにこの機能を追加することはそれほど難しくありません。の縮小検索:

x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?f:n:"")+(

これをxの前に追加

var accl = ''; if(this._get(a,"justMonth")) {accl = ' ui-datepicker-just_month';}

検索する

<table class="ui-datepicker-calendar

そしてそれを

<table class="ui-datepicker-calendar'+accl+'

も検索

this._defaults={

それを交換してください

this._defaults={justMonth:false,

CSSの場合は、次のように使用する必要があります。

.ui-datepicker table.ui-datepicker-just_month{
    display: none;
}

その後、すべてが完了したら、目的の日付ピッカー初期化関数に移動して、varの設定を提供します

$('#txt_month_chart_view').datepicker({
    changeMonth: true,
        changeYear: true,
        showButtonPanel: true,
        dateFormat: 'MM yy',
        justMonth: true,
        create: function(input, inst) {
            $(".ui-datepicker table").addClass("badbad");
        },
        onClose: function(dateText, inst) {
            var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
            var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
            $(this).datepicker('setDate', new Date(year, month, 1));
        }
});

justMonth: true ここでの鍵です:)



2

上記のBrianSのほぼ完全な応答にいくつかの改良を加えました。

  1. この場合、実際には少し読みやすくなると思うので、ショーで設定された値を再指定しました(ただし、少し異なる形式を使用していることに注意してください)。

  2. 私のクライアントはカレンダーを必要としていなかったので、他の日付ピッカーに影響を与えることなくそれを行うために、表示/非表示クラスの追加を追加しました。クラスの削除はタイマーで行われ、日付ピッカーがフェードアウトするときにテーブルがフラッシュアップするのを防ぎます。これは、IEでは非常に顕著です。

編集:これを解決するために残された1つの問題は、日付ピッカーを空にする方法がないことです-フィールドをクリアしてクリックすると、選択した日付が再入力されます。

EDIT2:私はこれをうまく解決できなかった(つまり、入力の横に個別のクリアボタンを追加せずに)ので、これを使用するだけになりました:https//github.com/thebrowser/jquery.ui.monthpicker-誰かができる場合標準的なUIを1つ入手して、すばらしいことを実現します。

    $('.typeof__monthpicker').datepicker({
        dateFormat: 'mm/yy',
        showButtonPanel:true,
        beforeShow: 
            function(input, dpicker)
            {                           
                if(/^(\d\d)\/(\d\d\d\d)$/.exec($(this).val()))
                {
                    var d = new Date(RegExp.$2, parseInt(RegExp.$1, 10) - 1, 1);

                    $(this).datepicker('option', 'defaultDate', d);
                    $(this).datepicker('setDate', d);
                }

                $('#ui-datepicker-div').addClass('month_only');
            },
        onClose: 
            function(dt, dpicker)
            {
                setTimeout(function() { $('#ui-datepicker-div').removeClass('month_only') }, 250);

                var m = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
                var y = $("#ui-datepicker-div .ui-datepicker-year :selected").val();

                $(this).datepicker('setDate', new Date(y, m, 1));
            }
    });

次のスタイルルールも必要です。

#ui-datepicker-div.month_only .ui-datepicker-calendar {
display:none
}

2

@ user1857829の回答と彼の「extend-jquery-like-a-pluginアプローチ」が好きでした。月や年を何らかの方法で変更したときに、ピッカーが実際にフィールドに日付を書き込むように少し変更しました。私はそれを少し使った後、その振る舞いが欲しいと思った。

jQuery.fn.monthYearPicker = function(options) {
  options = $.extend({
    dateFormat: "mm/yy",
    changeMonth: true,
    changeYear: true,
    showButtonPanel: true,
    showAnim: "",
    onChangeMonthYear: writeSelectedDate
  }, options);
  function writeSelectedDate(year, month, inst ){
   var thisFormat = jQuery(this).datepicker("option", "dateFormat");
   var d = jQuery.datepicker.formatDate(thisFormat, new Date(year, month-1, 1));
   inst.input.val(d);
  }
  function hideDaysFromCalendar() {
    var thisCalendar = $(this);
    jQuery('.ui-datepicker-calendar').detach();
    // Also fix the click event on the Done button.
    jQuery('.ui-datepicker-close').unbind("click").click(function() {
      var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
      var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
      thisCalendar.datepicker('setDate', new Date(year, month, 1));
      thisCalendar.datepicker("hide");
    });
  }
  jQuery(this).datepicker(options).focus(hideDaysFromCalendar);
}

2

私は受け入れられた答えに一定の困難を抱えてきましたが、他の誰も最小限の努力でベースとして使用することができませんでした。それで、私は受け入れられた回答の最新バージョンを、少なくとも最小のJSコーディング/再利用性の基準を満たすまで微調整することにしました。

ここでの方法である非常にクリーン液より3日(最新)版ベン・コラーの受け入れ答えは。さらに、それは:

  • mm/yy形式だけでなく、OPを含む他の形式でも機能しますMM yy
  • ページ上の他の日付ピッカーのカレンダーを非表示にしないでください。
  • 暗黙的にグローバルなJSオブジェクトを汚染しないdatestrmonthyearなどの変数。

見てみな:

$('.date-picker').datepicker({
    dateFormat: 'MM yy',
    changeMonth: true,
    changeYear: true,
    showButtonPanel: true,
    onClose: function (dateText, inst) {
        var isDonePressed = inst.dpDiv.find('.ui-datepicker-close').hasClass('ui-state-hover');
        if (!isDonePressed)
            return;

        var month = inst.dpDiv.find('.ui-datepicker-month').find(':selected').val(),
            year = inst.dpDiv.find('.ui-datepicker-year').find(':selected').val();

        $(this).datepicker('setDate', new Date(year, month, 1)).change();
        $('.date-picker').focusout();
    },
    beforeShow: function (input, inst) {
        var $this = $(this),
            // For the simplicity we suppose the dateFormat will be always without the day part, so we
            // manually add it since the $.datepicker.parseDate will throw if the date string doesn't contain the day part
            dateFormat = 'd ' + $this.datepicker('option', 'dateFormat'),
            date;

        try {
            date = $.datepicker.parseDate(dateFormat, '1 ' + $this.val());
        } catch (ex) {
            return;
        }

        $this.datepicker('option', 'defaultDate', date);
        $this.datepicker('setDate', date);

        inst.dpDiv.addClass('datepicker-month-year');
    }
});

そして、あなたが必要とする他のすべてはどこかで次のCSSです:

.datepicker-month-year .ui-datepicker-calendar {
    display: none;
}

それでおしまい。上記がさらなる読者のために時間を節約することを願っています。


1
正直に言って。「inst.dpDiv.addClass( 'datepicker-month-year');」という行 datepickerのカレンダーdivに月年​​全体を追加します。つまり、datepickerを使用する他の日付フィールドがある場合、そのために機能しなくなります。カレンダーにはdivが1つしかないため、 '$('。datepicker-month-year ')。removeClass(' datepicker-month-year ');'を追加すると興味深いでしょう。トラディショナルカレンダーを必要とする他の日付ピッカーにbeforeShowを使用する。または、フォーカスを失ったときにクラスを削除します。しかし、APIに関連するものは何も見つかりませんでした
Johnny Bigoode

1
これは、誰もが使うべき完全な答えです。私にとって解決された最大の問題は、日付エントリのポップアップが、既に何があるかに関係なく、常に現在の月と年にデフォルト設定されることでした。この答えはそれを修正しました。
Alex F

1

私はそれが少し遅い応答であることを知っていますが、私は数日前に同じ問題を抱えていて、私は素晴らしいスムーズな解決策を思いつきました。まず、ここでこの素晴らしい日付ピッカーを見つけまし

次に、次の例に付属するCSSクラス(jquery.calendarPicker.css)を更新しました。

.calMonth {
  /*border-bottom: 1px dashed #666;
  padding-bottom: 5px;
  margin-bottom: 5px;*/
}

.calDay 
{
    display:none;
}

プラグインは何かを変更するとイベントDateChangedを起動するので、日をクリックしなくても問題ありません(年と月の選択ツールとして適しています)。

それが役に立てば幸い!



1

ここで提供されているさまざまなソリューションを試してみましたが、いくつかのドロップダウンが必要な場合は問題なく機能しました。

最高の(外観など)「ピッカー」(https://github.com/thebrowser/jquery.ui.monthpickerここで提案されている)は、基本的には、_generateHTMLが書き換えられた古いバージョンのjquery-ui datepickerのコピーです。ただし、現在のjquery-ui(1.10.2)ではうまく機能しないことが判明し、その他の問題が発生しました(escで閉じない、他のウィジェットで閉じない、スタイルがハードコードされている)。

その月ピッカーを修正しようとするのではなく、最新の日付ピッカーを使用して同じプロセスを再試行するのではなく、既存の日付ピッカーの関連部分にフックしました。

これにはオーバーライドが含まれます。

  • _generateHTML(月の選択マークアップを作成するため)
  • parseDate(日コンポーネントがないと気に入らないため)、
  • _selectDay(datepickerが.html()を使用して日の値を取得するため)

この質問は少し古く、すでに十分に回答されているため、これがどのように行われたかを示す_selectDayオーバーライドのみです。

jQuery.datepicker._base_parseDate = jQuery.datepicker._base_parseDate || jQuery.datepicker.parseDate;
jQuery.datepicker.parseDate = function (format, value, settings) {
    if (format != "M y") return jQuery.datepicker._hvnbase_parseDate(format, value, settings);
    // "M y" on parse gives error as doesn't have a day value, so 'hack' it by simply adding a day component
    return jQuery.datepicker._hvnbase_parseDate("d " + format, "1 " + value, settings);
};

既に述べたように、これは古い質問ですが、有用であることがわかったので、代替ソリューションでフィードバックを追加したいと考えました。


0

月のピッカーの場合、JQuery v 1.7.2を使用して、次のJavaScriptを実行しています。

$l("[id$=txtDtPicker]").monthpicker({
showOn: "both",
buttonImage: "../../images/Calendar.png",
buttonImageOnly: true,
pattern: 'yyyymm', // Default is 'mm/yyyy' and separator char is not mandatory
monthNames: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']
});


0

ベン・ケーラーの解決策をありがとう。

ただし、日付ピッカーの複数のインスタンスに問題があり、日付の選択に必要なものもいくつかありました。ベンケーラーのソリューション(編集3)は機能しますが、すべてのインスタンスで日の選択を非表示にします。この問題を解決するアップデートは次のとおりです。

$('.date-picker').datepicker({
    dateFormat: "mm/yy",
    changeMonth: true,
    changeYear: true,
    showButtonPanel: true,
    onClose: function(dateText, inst) {
        if($('#ui-datepicker-div').html().indexOf('ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all ui-state-hover') > -1) {
            $(this).datepicker(
                'setDate',
                new Date(
                    $("#ui-datepicker-div .ui-datepicker-year :selected").val(),
                    $("#ui-datepicker-div .ui-datepicker-month :selected").val(),
                    1
                )
            ).trigger('change');
            $('.date-picker').focusout();
        }
        $("#ui-datepicker-div").removeClass("month_year_datepicker");
    },
    beforeShow : function(input, inst) {
        if((datestr = $(this).val()).length > 0) {
            year = datestr.substring(datestr.length-4, datestr.length);
            month = datestr.substring(0, 2);
            $(this).datepicker('option', 'defaultDate', new Date(year, month-1, 1));
            $(this).datepicker('setDate', new Date(year, month-1, 1));
            $("#ui-datepicker-div").addClass("month_year_datepicker");
        }
    }
});

-2

onSelectコールバックを使用して手動で年の部分を削除し、フィールドにテキストを手動で設定します


3
質問を読んでいないと思います。Aanuは「カレンダーではなく、月と年(2010年5月)を表示する」ことを望んでいます。
レイゲル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.