jQuery UI DatePicker เพื่อแสดงเดือนปีเท่านั้น


374

ฉันใช้ตัวเลือกวันที่ jQuery เพื่อแสดงปฏิทินทั่วแอพของฉัน ฉันต้องการทราบว่าฉันสามารถใช้มันเพื่อแสดงเดือนและปี (พฤษภาคม 2010) และไม่ใช่ปฏิทินหรือไม่


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 ได้ ปรับปรุง Better Solution บนพื้นฐานของโซลูชันของ rexwolf
http://jsfiddle.net/DBpJe/5106


14
การโทร 'setDate' จะเปิดตัวเลือกอีกครั้งในเบราว์เซอร์บางตัว เพื่อป้องกันสิ่งนี้ปิดใช้งานและเปิดใช้งานเครื่องมือเลือก: $ (นี่) .datepicker ('ปิดใช้งาน'); $ (นี่) .datepicker ('setDate', วันที่ใหม่ (ปี 1, เดือน 1, 1)); $ (นี้) .datepicker ( 'เปิดใช้งาน');
Sven Sönnichsen

1
@Sven นี่เป็นทางเลือก:$(this).val($.datepicker.formatDate('MM yy', new Date(year, month, 1)));
ThiamTeck

1
ฉันกำลังพยายามใช้โซลูชันนี้ แต่ใช้ getDate ใน datepicker ส่งคืนวันนี้เท่านั้น ว่าไง?
supertopi

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

@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

คำตอบข้างต้นค่อนข้างดี ข้อร้องเรียนเดียวของฉันคือคุณไม่สามารถล้างค่าเมื่อตั้งค่าแล้ว นอกจากนี้ฉันชอบวิธีการขยาย 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 ไม่เริ่มทำงานหรือไม่ได้รับค่าที่ถูกต้องหรือหาก overriden ทำให้วิดเจ็ตหยุดทำงาน
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));
            }
        }
    });
});

สิ่งนี้จะแก้ปัญหา =) แต่ฉันต้องการเวลารูปแบบ yyyy-mm

ลองใน FF4 เท่านั้น


"yy" ใน JQuery คือปีสี่หลัก หากนี่คือสิ่งที่คุณต้องการคุณเพิ่งจะประสบความสำเร็จ
Paweł Dyda

9

ฉันมีความต้องการแบบเดียวกันนี้ในวันนี้และพบสิ่งนี้ใน github ทำงานร่วมกับ jQueryUI และมีตัวเลือกเดือนแทนปฏิทิน

https://github.com/thebrowser/jquery.ui.monthpicker


5
ไม่ได้รับการบำรุงรักษา แต่มีทางแยก: github.com/zorab47/jquery.ui.monthpicker
denis.peplin

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

ฉันต้องการตัวเลือกเดือน / ปีสำหรับสองฟิลด์ (จาก & ถึง) และเมื่อมีการเลือก Max / Min ถูกตั้งค่าไว้ที่อีกอันหนึ่ง ... วันที่เลือกตั๋วสายการบิน ฉันมีปัญหาในการตั้งค่าสูงสุดและต่ำสุด ... วันที่ของฟิลด์อื่นจะถูกลบ ขอบคุณหลายกระทู้ข้างต้น ... ในที่สุดฉันก็ค้นพบมันได้ คุณต้องตั้งค่าตัวเลือกและวันที่ในลำดับที่เฉพาะเจาะจงมาก

ดูซอนี้สำหรับวิธีการแก้ปัญหาอย่างเต็มรูปแบบ: ตัวเลือกเดือน / ปี @ 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: ใน _showDatepicker: เพื่อให้การซ่อนราบรื่นขึ้น

patch2: ใน _checkOffset: เพื่อแก้ไขตำแหน่งตัวเลือกเดือน (มิฉะนั้นเมื่อฟิลด์อยู่ที่ด้านล่างของเบราว์เซอร์การตรวจสอบออฟเซตจะปิด);

patch3: ใน onClose ของ _hideDatepicker: มิฉะนั้นเมื่อปิดช่องวันที่จะกระพริบเป็นระยะเวลาสั้น ๆ ซึ่งน่ารำคาญมาก

ฉันรู้ว่าการแก้ไขของฉันยังห่างไกลจากความดี แต่ตอนนี้มันใช้งานได้ หวังว่ามันจะช่วย


JUst เพิ่มบรรทัดนี้เพื่อ beforeShow: {inst.dpDiv.addClass ('month_year_datepicker')} วันที่ที่กะพริบจะหยุดลง :) นอกจากนี้ฉันคิดว่า. โฟกัสจะไม่จำเป็นต้องใช้แล้ว
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 ในหน้าเดียวกัน: (หลีกเลี่ยงข้อผิดพลาดของ mutiple คลิกที่ปุ่มก่อนหน้าใน IE ที่อาจเกิดขึ้นหากเราใช้ฟังก์ชั่นโฟกัส)
    JS fiddle link

4

มันเป็นแค่ฉันหรือว่ามันไม่ทำงานอย่างที่ควรจะเป็นใน IE (8)? วันที่เปลี่ยนไปเมื่อคลิกเสร็จ แต่ datepicker จะเปิดขึ้นอีกครั้งจนกว่าคุณจะคลิกที่ใดที่หนึ่งในหน้าเพื่อคลายความสนใจไปที่ช่องป้อนข้อมูล ...

ฉันกำลังมองหาที่จะแก้ปัญหานี้

<!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
$ (นี้) .datepicker ( 'ปิด'); $ (นี่) .datepicker ('setDate', วันที่ใหม่ (ปี, เดือน, 1)); $ (นี้) .datepicker ( 'เปิดใช้งาน'); แก้ปัญหา
Tom Van Schoor

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

ลิงค์เสียชีวิต ไม่สามารถเข้าถึงเว็บไซต์นี้ได้ ไม่พบที่อยู่ DNS ของเซิร์ฟเวอร์ lucianocosta.info
ปาง

1
นี่คือลิงค์ที่อัปเดต: lucianocosta.com.br/jquery.mtz.monthpicker
Sebastian S.

ลิงก์ที่อัปเดตนั้นใช้งานไม่ได้
nasch

4

เหมือนคนอื่น ๆ ที่ผมเคยพบปัญหามากมายพยายามที่จะทำเช่นนี้และมีเพียงการรวมกันของการแก้ปัญหาที่โพสต์และในที่สุดก็สับขนาดใหญ่ที่จะทำให้มันสมบูรณ์แบบได้ที่ดินฉันวิธีการแก้ปัญหา

ปัญหาเกี่ยวกับการแก้ปัญหาอื่น ๆ ในหัวข้อนี้ที่ฉันได้ลอง:

  1. การเลือกวันที่ใหม่ใน datepicker ก็จะเปลี่ยนวันที่ (ภายใน) ของ datepickers อื่น ๆ ดังนั้นเมื่อคุณเปิดวันที่อื่นอีกครั้ง (หรือลองรับวันที่ของพวกเขา) พวกเขาจะมีวันที่แตกต่างจากที่แสดงในอินพุตที่กำหนด -field
  2. Datepicker จะไม่ "จำ" วันที่เมื่อเปิดอีกครั้ง
  3. รหัสสำหรับการเล่นกลวันที่ใช้การซับสตริงจึงไม่สามารถใช้งานได้กับทุกรูปแบบ
  4. "My monthpicker" เปลี่ยนเฉพาะช่องป้อนข้อมูลเมื่อปิดเท่านั้นไม่ใช่ทุกครั้งที่มีการเปลี่ยนแปลงค่า
  5. ฟิลด์อินพุตไม่ได้รับการอัปเดตอย่างถูกต้องหากคุณพิมพ์สตริงอินพุตในรูปแบบที่ไม่ถูกต้องสำหรับวันที่แล้วคลิก 'ปิด' บน datepicker
  6. ฉันไม่สามารถมี datepickers ปกติซึ่งแสดงวันที่ในหน้าเดียวกับ monthpickers ซึ่งไม่แสดงวันที่

ในที่สุดฉันก็พบวิธีแก้ไขปัญหาเหล่านี้ทั้งหมด สี่คนแรกสามารถแก้ไขได้ง่าย ๆ โดยระมัดระวังเกี่ยวกับวิธีที่คุณอ้างอิงวันที่และเดือนของคุณในรหัสภายในและแน่นอนว่าต้องทำการอัพเดทคู่มือตัวเลือกของคุณด้วยตนเอง สิ่งนี้คุณสามารถเห็นได้ในอินสแตนซ์ - ตัวอย่างใกล้ด้านล่าง ปัญหาที่ห้าสามารถช่วยได้โดยการเพิ่มรหัสที่กำหนดเองลงในฟังก์ชั่น datepicker

บันทึก:คุณไม่จำเป็นต้องใช้สคริปต์ monthpicker ต่อไปนี้เพื่อแก้ไขปัญหาสามข้อแรกใน datepicker ปกติของคุณ เพียงใช้สคริปต์อินสแตนซ์ datepicker ใกล้กับด้านล่างของโพสต์นี้

ตอนนี้หากต้องการใช้ monthpickers และแก้ไขปัญหาสุดท้ายเราจำเป็นต้องแยก Datepickers และ Monthpickers เราสามารถรับหนึ่งในไม่กี่ jQuery-UI ส่วนต่อเดือนของการต่อเติมที่นั่น แต่บางคนขาดความยืดหยุ่น / ความสามารถในการโลคัลไลซ์ชั่นบางคนขาดแอนิเมชันที่รองรับ ... ดังนั้นจะทำอย่างไร? สะสม "เจ้าของ" ของคุณจากรหัส datepicker! สิ่งนี้ทำให้คุณได้รับผลงานประจำเดือนอย่างเต็มที่โดยมีฟังก์ชั่นทั้งหมดของ datepicker เพียงแค่ไม่แสดงวัน

ฉันได้จัดทำjs-script monthpickerและCSS-script ที่มาพร้อมกันใช้งานร่วมกันโดยใช้วิธีการที่อธิบายไว้ด้านล่างด้วยรหัส jQuery-UI v1.11.1 เพียงคัดลอกตัวอย่างโค้ดเหล่านี้ไปยังไฟล์ใหม่สองไฟล์คือ monthpicker.js และ monthpicker.css ตามลำดับ

หากคุณต้องการอ่านเกี่ยวกับกระบวนการที่ค่อนข้างง่ายซึ่งฉันแปลง datepicker เป็น monthpicker ให้เลื่อนลงไปที่ส่วนสุดท้าย


ตอนนี้เพื่อเพิ่ม datepickers และ monthpickers ไปที่หน้า!

โค้ดต่อไปนี้จาวาสคริปต์ - โค้ดทำงานกับหลาย datepickers และ / หรือ monthpickers บนหน้าโดยไม่มีปัญหาดังกล่าว! แก้ไขโดยทั่วไปโดยใช้ '$ (สิ่งนี้)' มาก :)

สคริปต์แรกมีไว้สำหรับ datepicker ปกติและสคริปต์ที่สองสำหรับผู้สร้างรายเดือน "ใหม่"

คำติชมที่ออกมาหลังจากนั้นซึ่งช่วยให้คุณสร้างองค์ประกอบบางอย่างเพื่อล้างฟิลด์อินพุตนั้นถูกขโมยไปจากคำตอบของ Paul Richards

ฉันใช้รูปแบบ "MM yy" ใน monthpicker ของฉันและรูปแบบ 'yy-mm-dd' ใน datepicker ของฉัน แต่นี่เข้ากันได้อย่างสมบูรณ์กับทุกรูปแบบดังนั้นคุณมีอิสระที่จะใช้สิ่งที่คุณต้องการ เพียงเปลี่ยนตัวเลือก 'dateFormat' ตัวเลือกมาตรฐาน 'showButtonPanel', 'showAnim' และ 'yearRange' เป็นหลักสูตรเสริมและปรับแต่งตามความต้องการของคุณ


เพิ่ม datepicker

การเริ่มต้น Datepicker หนึ่งนี้ไปจาก 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

รวมไฟล์ 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 ของฉัน เพียงแค่ทำสิ่งที่คุณทำตามปกติเพื่อเพิ่ม datepicker ในหน้าของคุณและรวมสคริปต์ข้างต้นอาจโดยการเปลี่ยนตัวเลือก (หมายถึง $ ("# MyMonthTextBox")) เป็นสิ่งที่เหมาะกับคุณ

ฉันหวังว่านี่จะช่วยให้ใครบางคน

ลิงก์ไปที่ pastebins สำหรับการตั้งค่าวันที่และเดือนพิเศษบางรายการ:

  1. Monthpicker ทำงานในวันสุดท้ายของเดือน วันที่คุณได้รับจาก monthpicker นี้จะเป็นวันสุดท้ายของเดือน

  2. สอง monthpickers ร่วมมือ ; 'เริ่มต้น' กำลังทำงานในวันแรกของเดือนและ 'สิ้นสุด' กำลังทำงานในวันสุดท้ายของเดือน ทั้งคู่ถูก จำกัด ซึ่งกันและกันดังนั้นการเลือกเดือนใน 'สิ้นสุด' ซึ่งอยู่ก่อนเดือนที่เลือกใน 'เริ่ม' จะเปลี่ยน 'เริ่มต้น' เป็นเดือนเดียวกับ 'สิ้นสุด' และในทางกลับกัน. ตัวเลือก: เมื่อเลือกเดือนที่ 'เริ่มต้น' 'minDate' ที่ 'สิ้นสุด' จะถูกตั้งเป็นเดือนนั้น หากต้องการลบคุณลักษณะนี้ออกความคิดเห็นหนึ่งบรรทัดใน onClose (อ่านความคิดเห็น)

  3. สอง datepickers ร่วมมือ ; ทั้งคู่ถูก จำกัด โดยกันและกันดังนั้นการเลือกวันที่ 'สิ้นสุด' ซึ่งอยู่ก่อนวันที่เลือกใน 'เริ่มต้น' จะเปลี่ยน 'เริ่มต้น' เป็นเดือนเดียวกับ 'สิ้นสุด' และในทางกลับกัน. ตัวเลือก: เมื่อเลือกวันที่ที่ 'เริ่มต้น' 'minDate' ที่ 'สิ้นสุด' ถูกตั้งค่าเป็นวันที่ หากต้องการลบคุณลักษณะนี้ออกความคิดเห็นหนึ่งบรรทัดใน onClose (อ่านความคิดเห็น)


ฉันเปลี่ยน DatePicker ให้กลายเป็น MonthPicker ได้อย่างไร

ฉันได้นำรหัสจาวาสคริปต์ทั้งหมดจาก jquery-ui-1.11.1.js ที่เกี่ยวข้องกับ datepicker ของพวกเขาวางลงใน js-file ใหม่และแทนที่สตริงต่อไปนี้:

  • "datepicker" ==> "monthpicker"
  • "Datepicker" ==> "Monthpicker"
  • "ตัวเลือกวันที่" ==> "ตัวเลือกเดือน"
  • "ตัวเลือกวันที่" ==> "ตัวเลือกเดือน"

จากนั้นฉันก็ลบส่วนหนึ่งของ for-loop ซึ่งสร้าง div ui-datepicker-calendar ทั้งหมด (div ซึ่งโซลูชันอื่นซ่อนโดยใช้ CSS) สามารถพบได้ใน _generateHTML: function (inst)

ค้นหาบรรทัดที่ระบุว่า:

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

ทำเครื่องหมายทุกอย่างตั้งแต่หลังจากปิดแท็ก divไปจนถึง (และไม่รวม) บรรทัดที่ระบุ:

drawMonth++;

ตอนนี้มันจะไม่มีความสุขเพราะเราต้องปิดบางสิ่ง หลังจากปิดแท็ก div ก่อนหน้าให้เพิ่ม:

";

ตอนนี้โค้ดควรถูกรวมเข้าด้วยกันเป็นอย่างดี ต่อไปนี้เป็นข้อมูลโค้ดที่แสดงถึงสิ่งที่คุณควรจะได้รับ:

...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 ที่เกี่ยวข้องกับ datepickers ไปยังไฟล์ CSS ใหม่และแทนที่สตริงต่อไปนี้:

  • "datepicker" ==> "monthpicker"

3

หลังจากขุด jQueryUI.com สำหรับ datepicker ต่อไปนี้เป็นข้อสรุปและคำตอบสำหรับคำถามของคุณ

ก่อนอื่นฉันจะบอกว่าไม่มีคำถามของคุณ คุณไม่สามารถใช้ dateQuicker jQueryUI สำหรับการเลือกเดือนและปีเท่านั้น ไม่รองรับ มันไม่มีฟังก์ชั่นการโทรกลับ

แต่คุณสามารถแฮ็คมันเพื่อแสดงเฉพาะเดือนและปีโดยใช้ css เพื่อซ่อนวัน ฯลฯ และฉันคิดว่าคงไม่สมเหตุสมผลเพราะคุณต้องการให้คลิกเพื่อเลือกวันที่

ฉันสามารถพูดได้ว่าคุณเพียงแค่ต้องใช้ datepicker อื่น เหมือนที่โรเจอร์แนะนำ


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 ที่คุณต้องการและให้การตั้งค่า 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. ลูกค้าของฉันไม่ต้องการปฏิทินดังนั้นฉันจึงเพิ่มการเพิ่มในการแสดง / ซ่อนการทำเช่นนั้นโดยไม่กระทบกับ datepickers อื่น ๆ การลบคลาสอยู่บนตัวจับเวลาเพื่อหลีกเลี่ยงตารางที่กระพริบกลับขึ้นเมื่อ datepicker หายไปซึ่งดูเหมือนจะเห็นได้ชัดเจนมากใน IE

แก้ไข: ปัญหาหนึ่งที่เหลือสำหรับการแก้ไขคือไม่มีวิธีล้าง datepicker - ล้างข้อมูลในฟิลด์แล้วคลิกไปและมันจะ repopulate กับวันที่ที่เลือก

แก้ไข 2: ฉันยังไม่ได้จัดการเพื่อแก้ปัญหานี้อย่างดี (เช่นโดยไม่ต้องเพิ่มปุ่มล้างแยกต่างหากถัดจากอินพุต) ดังนั้นจึงจบลงด้วยการใช้สิ่งนี้: 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 และวิธีการ "ขยาย -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 (ล่าสุด)ของคำตอบที่ยอมรับของBen Koehler ยิ่งไปกว่านั้นมันจะ:

  • ทำงานได้ไม่เฉพาะกับmm/yyรูปแบบ แต่รวมถึงรูปแบบอื่น ๆ ของ OP MM yyด้วย
  • ไม่ซ่อนปฏิทินของ datepickers อื่น ๆ ในหน้า
  • ไม่ก่อให้เกิดมลพิษโดยปริยายวัตถุ 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
เพียงแค่และ FYI บรรทัด 'inst.dpDiv.addClass (' datepicker-month-year ');' จะเพิ่มทั้งปีต่อปีให้กับ div ของ datepicker ในปฏิทินซึ่งหมายความว่าหากมีช่องวันที่อื่น ๆ ที่มี datepicker อยู่พวกเขาจะหยุดทำงานเพราะสิ่งนั้น เนื่องจากมีเพียง div เดียวสำหรับปฏิทินจึงน่าสนใจที่จะเพิ่ม '$ ('. datepicker-month-year ') removeClass (' datepicker-month-year ');' ใช้ beforeShow ไปยัง datepickers อื่น ๆ ที่ต้องการปฏิทินแบบดั้งเดิม หรือลบชั้นเรียนเมื่อคุณไม่โฟกัส แต่ฉันไม่พบสิ่งใดที่เกี่ยวข้องกับสิ่งนั้นใน 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 ) ที่แนะนำที่นี่นั้นเป็นสำเนาของรุ่นเก่าของ jquery-ui datepicker ที่เขียนด้วย _generateHTML อย่างไรก็ตามฉันพบว่ามันไม่เล่นได้ดีกับ jquery-ui ปัจจุบัน (1.10.2) อีกต่อไปและมีปัญหาอื่น ๆ (ไม่ปิด esc ไม่ปิดการเปิดวิดเจ็ตอื่นมีสไตล์ฮาร์ดโค้ด)

แทนที่จะพยายามแก้ไข monthpicker นั้นและแทนที่จะลองกระบวนการเดียวกันกับ datepicker ล่าสุดใหม่อีกครั้งฉันจึงไปเกี่ยวกับส่วนที่เกี่ยวข้องของตัวใช้เลือกวันที่ที่มีอยู่

เรื่องนี้เกี่ยวข้องกับการเอาชนะ:

  • _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

สำหรับ monthpicker โดยใช้ 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

ขอบคุณสำหรับโซลูชันของ Ben Koehler

อย่างไรก็ตามฉันมีปัญหากับ datepickers หลายอินสแตนซ์ซึ่งบางอันต้องการการเลือกวัน โซลูชันของ 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) และไม่ใช่ปฏิทิน"
Reigel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.