월별 만 표시하는 jQuery UI DatePicker


374

jQuery 날짜 선택기를 사용하여 내 앱 전체에 캘린더를 표시하고 있습니다. 달력이 아닌 월과 연도 (2010 년 5 월)를 표시하는 데 사용할 수 있는지 알고 싶습니다.


16
당신은 월 선택기를 원하십니까?
dotty

jQueryUI DatePicker를 사용하고 있습니까?
wpjmurray

예. jQueryUI DatePicker
Aanu

6
이것은 귀하의 질문에 대한 답변은 아니지만 지금 우리는 훨씬 더 좋아 보입니다 : eternicode.github.io/bootstrap-datepicker/…
Ruben

bootstrap-datepicker는 단종 된 repo처럼 보이며, 어떤 문제도 해결하지 않고 계속해서 문제를 제기하고 있습니다.
kumarharsh

답변:


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의 솔루션 다운을 기반으로 더 나은 솔루션을 업데이트했습니다.
http://jsfiddle.net/DBpJe/5106


14
'setDate'를 호출하면 일부 브라우저에서 선택기가 다시 열립니다. 이를 방지하려면 피커를 비활성화 및 활성화하십시오. $ (this) .datepicker ( 'disable'); $ (this) .datepicker ( 'setDate', 새로운 날짜 (year1, month1, 1)); $ (this) .datepicker ( 'enable');
Sven Sönnichsen 님이

1
@Sven은 대안입니다 :$(this).val($.datepicker.formatDate('MM yy', new Date(year, month, 1)));
ThiamTeck

1
이 솔루션을 사용하려고하지만 datepicker에서 getDate를 사용하면 오늘만 반환됩니다. 뭐야?
supertopi

1
대부분의 예제가 페이지 자체에서 인라인 스타일을 사용하고 있습니다. 같은 페이지에 캘린더가 둘 이상 (예 : 설정이 다른 경우)있는 경우 문제가 될 수 있습니다. #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;} 다음 과 같이 .css 파일에 스타일을 추가하는 것을 선호합니다. 그런 다음 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

@ Ben Koehler , 그거 지사입니다! 날짜 선택기의 단일 인스턴스를 두 번 이상 사용하면 예상대로 작동하도록 약간 수정했습니다. 이 수정이 없으면 날짜가 잘못 구문 분석되고 이전에 선택한 날짜가 강조 표시되지 않습니다.

<!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

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 자리 연도입니다. 이것이 당신이 원하는 것이라면, 당신은 그것을 달성했습니다.
Paweł Dyda


8

여기에 내가 생각해 낸 것이 있습니다. 추가 스타일 블록이 필요없이 달력을 숨기고 입력을 클릭하면 값을 지우지 못하는 문제를 처리하기 위해 지우기 단추를 추가합니다. 같은 페이지의 여러 달 선택 도구와도 잘 작동합니다.

HTML :

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

자바 스크립트 :

$(".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

두 필드 (From & To)에 대해 월 / 년 피커가 필요했고 하나를 선택했을 때 최대 / 최소가 다른 필드에 설정되었습니다. 최대 및 최소 설정 문제가 발생했습니다 ... 다른 필드의 날짜가 지워집니다. 위의 여러 게시물 덕분에 ... 나는 마침내 알아 냈습니다. 옵션과 날짜를 매우 구체적인 순서로 설정해야합니다.

전체 솔루션은 다음 바이올린을 참조하십시오 .JSFiddle @ Month / Year Picker

암호:

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 : in _checkOffset : 월 선택기 위치를 수정합니다 (그렇지 않으면 필드가 브라우저의 맨 아래에 있으면 오프셋 확인이 해제 됨).

patch3 : _hideDatepicker의 onClose에 : 그렇지 않으면 날짜 필드를 닫을 때 매우 짧은 기간 동안 깜박이는 것은 매우 성가시다.

내 수정이 그리 좋지는 않았지만 지금은 작동하고 있습니다. 도움이 되길 바랍니다.


그냥이 줄을 beforeShow : {inst.dpDiv.addClass ( 'month_year_datepicker')}에 추가하십시오. 깜박이는 날짜가 중지됩니다 :). 또한 .focus가 필요하지 않다고 생각합니다
Parag

5

하나 더 간단한 솔루션 추가

 $(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/
특징 :

  • 월 / 년만 표시
  • 완료 버튼을 클릭 할 때만 월 연도 값을 입력 상자에 추가합니다
  • "완료"를 클릭 할 때 "다시 열기"동작이 없음
    ------------------------------------
    다른 해결책 같은 페이지의 datepicker 및 monthpicker의 경우 : (또한 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', 새로운 날짜 (년, 월, 1)); $ (this) .datepicker ( 'enable'); 문제를 해결합니다.
Tom Van Schoor 13:24의

1
이것은 대답이 아닙니다
sisharp

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
업데이트 된 링크는 다음과 같습니다. lucianocosta.com.br/jquery.mtz.monthpicker
Sebastian S.

업데이트 된 링크도 끊어졌습니다.
nasch

4

다른 많은 사람들과 마찬가지로이 작업을 수행하는 데 많은 문제가 발생했으며 솔루션의 조합 만 게시하고 궁극적으로 완벽하게 해킹하여 솔루션을 얻었습니다 .

내가 시도한이 스레드의 다른 솔루션 관련 문제 :

  1. 날짜 선택기에서 새 날짜를 선택하면 다른 날짜 선택기의 (내부) 날짜도 변경되므로 다른 날짜 선택기를 다시 열거 나 날짜를 가져 오려고하면 지정된 입력에 표시된 날짜와 다른 날짜가됩니다. -들.
  2. 날짜 선택기는 다시 열 때 날짜를 "기억"하지 않습니다.
  3. 날짜를 저글링하는 코드는 하위 문자열을 사용하므로 모든 형식과 호환되지 않았습니다.
  4. "나의 monthpicker"는 값을 변경할 때가 아니라 입력 필드를 닫을 때만 입력 필드를 변경했습니다.
  5. 날짜 형식이 잘못된 입력 문자열을 입력 한 후 날짜 선택기에서 '닫기'를 클릭하면 입력 필드가 올바르게 업데이트되지 않습니다.
  6. 일자를 표시하지 않는 monthpickers와 동일한 페이지에 일자를 표시하는 일반적인 날짜 선택기를 사용할 수 없습니다.

마침내이 모든 문제해결 하는 방법을 찾았습니다 . 처음 네 개는 날짜 및 월 선택기를 내부 코드에서 참조하는 방법에주의하고 선택기를 수동으로 업데이트하여 간단히 수정할 수 있습니다. 이것은 하단 근처의 인스턴스화 예제에서 볼 수 있습니다. 다섯 번째 문제는 datepicker 함수에 사용자 정의 코드를 추가하여 도움이 될 수 있습니다.

참고 : 일반적인 날짜 선택 도구에서 처음 세 가지 문제를 해결하기 위해 다음 달 선택 도구를 사용할 필요는 없습니다. 이 게시물의 하단 근처에 날짜 선택기 인스턴스화 스크립트를 사용하십시오.

이제 월별 선택기를 사용하고 마지막 문제를 해결하려면 날짜 선택기와 월 선택기를 분리해야합니다. 우리는 몇 가지 jQuery-UI 월별 선택기 애드온 중 하나를 얻을 수 있지만 일부는 현지화 유연성 / 기능이 부족하고 일부는 애니메이션 지원이 부족합니다 ... 그래서 어떻게해야합니까? 날짜 선택기 코드에서 "자신의"롤을 만드십시오! 그러면 날짜 표시없이 날짜 선택기의 모든 기능을 갖춘 완전한 기능의 월별 선택기를 사용할 수 있습니다.

I는 공급하고 monthpicker의 JS 스크립트첨부 CSS 스크립트를 상기 방법은 - JQuery와 UI의 v1.11.1 코드 후술 사용. 이 코드 스 니펫을 각각 monthpicker.js와 monthpicker.css라는 두 개의 새 파일로 복사하십시오.

datepicker를 monthpicker로 변환 한 다소 간단한 프로세스에 대해 읽으려면 마지막 섹션으로 스크롤하십시오.


이제 날짜 선택기 및 월 선택기를 페이지에 추가하십시오!

다음 자바 스크립트 코드 조각 은 위에서 언급 한 문제없이 페이지에서 여러 날짜 선택기 및 / 또는 월 선택기와 함께 작동 합니다! 일반적으로 '$ (this)'를 사용하여 수정했습니다. 많이 :)

첫 번째 스크립트는 일반적인 날짜 선택 도구이고 두 번째 스크립트는 "새"월 선택 도구입니다.

입력 필드를 지우는 요소를 만들 수있는 주석 처리되지 않은 .after 는 Paul Richards의 답변에서 도난되었습니다.

monthpicker에서 "MM yy"형식을 사용하고 datepicker에서 '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('');
    //    })
    //)
    ;

월별 선택기 추가

monthpicker.js 파일과 monthpicker.css 파일을 monthpickers를 사용하려는 페이지에 포함하십시오.

Monthpicker 인스턴스화이 Monthpicker 에서 검색된 값은 항상 선택한 달의 첫 번째 날입니다. 현재 달에 시작하여 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. 매월 마지막 날에 작업하는 Monthpicker . 이 월 선택 도구에서받은 날짜는 항상 해당 월의 마지막 날입니다.

  2. 두 개의 협업 월 선택기 ; 'start'는 매월 1 일에 작동하며 'end'는 마지막 달에 작동합니다. 둘 다 서로 제한되어 있으므로 '시작'에서 선택한 달 이전의 '끝'에서 한 달을 선택하면 '시작'이 '끝'과 같은 달로 변경됩니다. 그 반대. 선택 사항 : 'start'에서 월을 선택하면 'end'의 'minDate'가 해당 월로 설정됩니다. 이 기능을 제거하려면 onClose에서 한 줄을 주석 처리하십시오 (주석 읽기).

  3. 두 개의 협업 날짜 선택기 ; 둘 다 서로 제한되어 있으므로 '시작'에서 선택한 날짜 이전의 '끝'에서 날짜를 선택하면 '시작'이 '끝'과 같은 달로 변경됩니다. 그 반대. 선택 사항 : 'start'에서 날짜를 선택하면 'end'의 'minDate'가 해당 날짜로 설정됩니다. 이 기능을 제거하려면 onClose에서 한 줄을 주석 처리하십시오 (주석 읽기).


DatePicker를 MonthPicker로 변경 한 방법

날짜 선택기와 관련된 jquery-ui-1.11.1.js에서 모든 자바 스크립트 코드를 가져 와서 새 js 파일에 붙여 넣고 다음 문자열을 바꿨습니다.

  • "datepicker"==> "월 피커"
  • "Datepicker"==> "Monthpicker"
  • "날짜 선택기"==> "월 선택기"
  • "날짜 선택기"==> "월 선택기"

그런 다음 for-loop의 일부를 제거하여 전체 ui-datepicker-calendar div (다른 솔루션이 CSS를 사용하여 숨기는 div)를 만듭니다. 이것은 _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...

그런 다음 날짜 선택기와 관련된 jquery-ui.css의 코드를 새 CSS 파일로 복사 / 붙여 넣기하고 다음 문자열을 바꿨습니다.

  • "datepicker"==> "월 피커"

3

datepicker에 대해 jQueryUI.com을 파고 내 질문에 대한 결론과 대답은 다음과 같습니다.

먼저, 나는 당신의 질문에 아니오 라고 말할 것 입니다. 월과 연도 선택에만 jQueryUI 날짜 선택기를 사용할 수 없습니다. 지원되지 않습니다. 콜백 기능이 없습니다.

그러나 CSS를 사용하여 요일 등을 숨겨서 월과 연도 만 표시 하도록 해킹 할 수 있습니다 . 그리고 날짜를 선택하려면 클릭 해야하는 날짜가 여전히 의미가 없다고 생각합니다.

다른 날짜 선택기를 사용해야한다고 말할 수 있습니다. Roger가 제안한 것과 같습니다.


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;
}

그 후 모든 것이 끝나면 원하는 datepicker init 함수로 이동하여 설정 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. 이 경우 실제로 약간 더 읽을 수 있다고 생각하기 때문에 show에 설정된 값을 정규화했습니다 (약간 다른 형식을 사용하고 있음에도 불구하고)

  2. 내 고객은 캘린더를 원하지 않았기 때문에 다른 날짜 선택에 영향을 미치지 않고 일정을 추가 / 숨기기 클래스 추가했습니다. 클래스 선택 제거는 datepicker가 사라질 때 테이블이 다시 깜박이지 않도록 타이머에 있습니다 .IE에서 매우 눈에.니다.

편집 :이 문제를 해결하기 위해 남겨진 한 가지 문제는 날짜 선택기를 비울 수있는 방법이 없다는 것입니다. 필드를 지우고 클릭하면 선택한 날짜로 다시 채워집니다.

EDIT2 :이 문제를 잘 해결하지 못했습니다 (즉, 입력 옆에 별도의 지우기 버튼을 추가하지 않음).이를 사용하여 끝났습니다 : https://github.com/thebrowser/jquery.ui.monthpicker- 누구나 할 수 있다면 표준 UI를 사용하여 놀라운 작업을 수행하십시오.

    $('.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 approach"가 마음에 들었습니다. 방금 월 또는 연도를 변경할 때 피커가 실제로 필드에 날짜를 쓰도록 약간 수정했습니다. 나는 그것을 조금 사용한 후에 그 행동을 원한다는 것을 알았습니다.

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 객체를 더럽 히지 datestr, month, year등의 변수.

확인 해봐:

$('.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가 있으므로 '$ ('. datepicker-month-year '). removeClass ('datepicker-month-year ');'를 추가하는 것이 흥미로울 것입니다. tradicional 일정이 필요한 다른 날짜 선택기에 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

나는 여기에 제공된 다양한 솔루션을 시도했으며 단순히 두 개의 드롭 다운을 원한다면 제대로 작동했습니다.

여기에 제안 된 최고의 (외관 등) 'picker'( 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를 사용하는 monthpicker의 경우 다음과 같은 자바 스크립트가 있습니다.

$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

Ben Koehler의 솔루션에 감사드립니다.

그러나 여러 날짜 선택 도구 인스턴스에 문제가 있었고 그 중 일부는 요일 선택에 필요했습니다. Ben Koehler의 솔루션 (편집 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 월)를 표시하고 싶습니다".
Reigel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.