jQuery UI DatePicker yalnızca ay yılını gösterir


374

Uygulamamın her yerinde takvimi görüntülemek için jQuery tarih seçici kullanıyorum. Takvimi değil, ayı ve yılı (Mayıs 2010) görüntülemek için kullanıp kullanamayacağımı bilmek istiyorum.


16
Yani bir ay seçici ister misin?
dotty

JQueryUI DatePicker kullanıyor musunuz?
wpjmurray

Evet. jQueryUI DatePicker
Aanu

6
bu sorunuzun cevabı değil, ama şimdi buna sahibiz, çok daha iyi görünüyor: eternicode.github.io/bootstrap-datepicker/…
Ruben

Bootstrap-datepicker durdurulan bir repo gibi görünüyor, sorunlar onları düzeltmeye gitmeden fark edilir bir çalışma olmadan
birikiyor

Yanıtlar:


424

İşte bir kesmek (.html dosyasının tamamı ile güncellendi):

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

Yukarıdaki örnek için jsfiddle'ı DÜZENLE : http://jsfiddle.net/DBpJe/7755/

DÜZENLE 2 Yalnızca yıl Tamam düğmesine tıklandığında giriş kutusuna ay yıl değerini ekler. Ayrıca yukarıdaki alanda mümkün olmayan giriş kutusu değerlerinin silinmesine izin verir http://jsfiddle.net/DBpJe/5103/

EDIT 3 , rexwolf'un çözümüne dayalı olarak Daha İyi Çözüm'ü güncelledi.
http://jsfiddle.net/DBpJe/5106


14
'SetDate' çağrıldığında, bazı tarayıcılarda seçici yeniden açılır. Bunu önlemek için seçiciyi devre dışı bırakıp etkinleştirin: $ (this) .datepicker ('devre dışı'); $ (this) .datepicker ('setDate', yeni Tarih (yıl1, ay1, 1)); $ (this) .datepicker ( 'enable');
Sven Sönnichsen

1
@Sven burada bir alternatif:$(this).val($.datepicker.formatDate('MM yy', new Date(year, month, 1)));
ThiamTeck

1
Bu çözümü kullanmaya çalışıyorum, ancak getDate kullanarak bir datepicker yalnızca bugün döndürür. Naber?
supertopi

1
Çoğu örneğin sayfanın kendisinde satır içi stiller kullandığını görüyorum. Aynı sayfada birden fazla takvime (örneğin, her biri farklı ayarlara sahip) ihtiyacınız varsa, bu bir sorun olacaktır. Ben .css dosyasında gibi stilleri eklemeyi tercih ederim: #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;} Ve sonra davranış manipüle etmek için Javascript kullanın:$("#ui-datepicker-div").addClass('noCalendar');
poweratom

1
Yukarıdaki örnekte metin kutusunu temizlemek istersem yapamam. Biri bana yardım edebilir mi.
Bik

83

Bu kod benim için kusursuz çalışıyor:

<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" />

Çıktı:

resim açıklamasını buraya girin


Bu takvime nasıl değer ayarlanabilir.
Rafik malek

62

@ Ben Koehler , bu vali! Tarih seçicinin tek bir örneğinin birden çok kez kullanılması beklendiği gibi çalışacak şekilde küçük bir değişiklik yaptım. Bu değişiklik olmadan tarih yanlış ayrıştırılır ve önceden seçilen tarih vurgulanmaz.

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

Bu cevap çoğunlukla doğrudur. Ancak, bir tarih seçildiğinde seçilecek doğru ayı elde etmek için MM'yi M olarak değiştirmek zorunda kaldım.
Chazaq

18

Yukarıdaki cevaplar oldukça iyi. Benim tek şikayet ayarlandıktan sonra değeri silemezsiniz olmasıdır. Ayrıca, ext-jquery benzeri bir eklenti yaklaşımını tercih ediyorum.

Bu benim için mükemmel çalışıyor:

$.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);
}

Sonra şöyle çağır:

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

2
Sonunda bunu indiremiyorum çünkü onSelect ve / veya onChangeMonthYear ve / veya onClose olayları ya tetiklenmiyor ya da doğru değerleri almıyor ya da geçersiz kılınmışsa widget'ın çalışmayı durdurduğundan
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));
            }
        }
    });
});

Bu sorunu çözecektir =) Ama timeFormat yyyy-mm istedim

Sadece FF4'te denedi


JQuery'de "yy" dört haneli bir yıl. Eğer istediğin buysa, bunu başardın.
Paweł Dyda


8

İşte benimle geldim. Ek bir stil bloğuna ihtiyaç duymadan takvimi gizler ve girdiyi tıkladıktan sonra değeri temizleyememe sorunu ile başa çıkmak için net bir düğme ekler. Aynı sayfada birden çok monthpicker ile de iyi çalışır.

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

İki alan için bir Ay / Yıl seçici gerekiyordu (Kimden & Kime) ve biri seçildiğinde Max / Min diğer bir ... a la picking havayolu bilet tarihleri ​​ayarlandı. Ben max ve min ayarlama sorunları yaşıyordu ... diğer alanın tarihleri ​​silinir. Yukarıdaki yazıların birçoğu sayesinde ... Sonunda anladım. Seçenekleri ve tarihleri ​​çok özel bir sırayla ayarlamanız gerekir.

Tam çözüm için şu kemanı görün: Ay / Yıl Seçici @ JSFiddle

Kod:

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

        }
    });

Ayrıca, yukarıda belirtildiği gibi bir stil bloğuna ekleyin:

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

5

Yukarıdaki iyi cevapların birçoğunu birleştirdim ve buna ulaştım:

    $('#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)
                });
            });

Bu çalıştığı kanıtlandı ama birçok hata ile karşı karşıya, bu yüzden datepicker çeşitli yerlerde yama zorunda kaldı:

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

patch1: _showDatepicker: gizlemeyi düzeltmek için;

patch2: _checkOffset: ay seçici konumunu düzeltmek için (aksi takdirde alan tarayıcının altındaysa, ofset kontrolü kapalıdır);

patch3: in on _hideDatepicker öğesinin kapanışı: aksi takdirde tarih alanları kapatılırken çok sinir bozucu çok kısa bir süre yanıp söner.

Düzeltmemin iyi olmaktan uzak olduğunu biliyorum ama şimdilik çalışıyor. Umarım yardımcı olur.


JUst bu satırı beforeShow'a ekleyin: {inst.dpDiv.addClass ('month_year_datepicker')}. yanıp sönen tarihler durur :). Ayrıca düşünüyorum .focus o zaman gerekli olmayacak
Parag

5

Bir basit çözüm daha ekleyin

 $(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/
Özellikler :

  • sadece ayı / yılı göster
  • Yalnızca Bitti düğmesine tıklandığında giriş kutusuna ay yıl değerini ekler
  • "Bitti" yi tıkladığınızda "yeniden aç" davranışı yok
    ------------------------------------ çalışan
    başka bir çözüm aynı sayfada datepicker ve monthpicker için iyi: (ayrıca odak fonksiyonunu kullanırsak meydana gelebilecek IE'de önceki düğmeye birden fazla tıklama hatasını önlemek)
    JS keman bağlantısı

4

Sadece ben mi yoksa IE'de olması gerektiği gibi çalışmıyor mu (8)? Tamam tıklatıldığında tarih değişir, ancak giriş alanına odaklanmak için sayfada bir yere tıklayana kadar tarih seçici tekrar açılır ...

Bunu çözmek için arıyorum.

<!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
( 'devre dışı') $ (this) .datepicker; $ (this) .datepicker ('setDate', yeni Tarih (yıl, ay, 1)); $ (this) .datepicker ( 'enable'); Sorunu çözer.
Tom Van Schoor

1
Bu bir cevap değil
sisharp

4

Bir ay seçici arıyorsanız bu jquery.mtz.monthpicker deneyin

Bu benim için iyi çalıştı.

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

Bağlantı öldü. Bu siteye ulaşılamıyor | lucianocosta.info kullanıcısının sunucu DNS adresi bulunamadı.
Pang

1
İşte güncellenmiş bir bağlantı: lucianocosta.com.br/jquery.mtz.monthpicker
Sebastian S.

Güncellenmiş bağlantı da bozuldu.
nasch

4

Diğerleri gibi, bunu yapmaya çalışırken çok sayıda sorunla karşılaştım ve sadece gönderilen çözümlerin bir kombinasyonu ve sonunda mükemmel hale getirmek için büyük bir hack bana bir çözüm .

Bu konuyu denedim diğer çözümler ile ilgili sorunlar:

  1. Bir tarih seçicide yeni bir tarih seçmek, diğer tarih seçicilerin (dahili) tarihlerini de değiştirir, böylece diğerlerini tekrar açtığınızda (veya tarihlerini almaya çalıştığınızda), atanan girdilerinde görüntülenen tarihten farklı bir tarihe sahip olurlar -alan.
  2. Tarih seçici tekrar açıldığında tarihi "hatırlamaz".
  3. Tüm biçimlerle uyumlu olmaması için alt dize kullanmanın tarihlerini hokkabazlık kodu.
  4. "Aylık seçicim", giriş alanını yalnızca değer değiştirildiği zaman değil, kapatıldığında değiştirdi.
  5. Bir tarih için yanlış biçimlendirilmiş bir giriş dizesi yazarsanız ve ardından tarih seçicide 'Kapat'ı tıklarsanız, giriş alanı doğru şekilde güncelleştirilmez.
  6. Günleri gösteren normal datepickers'larım, günleri göstermeyen monthpickers'larla aynı sayfada olamaz.

Sonunda tüm bu sorunları çözmenin bir yolunu buldum . İlk dördü, tarih ve ay seçicilerinize dahili kodlarında nasıl referans verdiğinize dikkat ederek ve elbette seçicilerinizin manuel olarak güncellenmesini sağlayarak düzeltilebilir. Bu, tabanın yakınındaki örnekleme örneklerinde görebilirsiniz. Beşinci soruna, tarih seçici işlevlerine bazı özel kodlar ekleyerek yardımcı olabilirsiniz.

NOT: Normal tarih seçicinizdeki ilk üç sorunu gidermek için aşağıdaki ay seçici komut dosyalarını kullanmanız GEREKMEZ. Bu yayının altına yakın bir tarih seçici örnekleme komut dosyası kullanmanız yeterlidir.

Şimdi, monthpickers'ı kullanmak ve son sorunu düzeltmek için, datepickers'ları ve monthpickers'ları ayırmamız gerekir. Birkaç jQuery-UI ay seçici eklentisinden birini alabiliriz, ancak bazılarında yerelleştirme esnekliği / yeteneği yok, bazıları animasyon desteği yok ... yani ne yapmalı? Datepicker kodundan "kendi" atın! Bu, tarih görüntüleyicinin tüm işlevleriyle günleri göstermeden tam olarak çalışan bir ay seçici sağlar.

Bir monthpicker js-script ve beraberindeki CSS-script sağladımJQuery-UI v1.11.1 kodu ile, aşağıda açıklanan yöntemi kullanarak, sağladı. Bu kod parçacıklarını sırasıyla monthpicker.js ve monthpicker.css adlı iki yeni dosyaya kopyalamanız yeterlidir.

Tarih seçiciyi bir ay seçiciye dönüştürdüğüm oldukça basit işlemi okumak istiyorsanız, son bölüme ilerleyin.


Şimdi tarihe ve ay seçicilerini sayfaya eklemek için!

Aşağıdaki javascript kod parçacıkları , yukarıda belirtilen sorunlar olmadan sayfada birden çok tarih ve / veya ay seçici ile çalışır! Genellikle '$ (this)' kullanılarak düzeltildi. çok :)

İlk kod normal bir tarih seçici, ikincisi ise "yeni" ay seçici içindir.

Dışarı yorumladı. SonraGirdi alanını temizlemek için bir öğe oluşturmanıza izin veren , Paul Richards'ın cevabından çalındı.

Benim ay seçici "MM yy" biçimini ve benim tarih seçici 'yy-aa-gg' biçimini kullanıyorum, ama bu tüm biçimlerle tamamen uyumlu , bu yüzden istediğinizi kullanmakta özgürsünüz. 'DateFormat' seçeneğini değiştirmeniz yeterlidir. 'ShowButtonPanel', 'showAnim' ve 'yearRange' standart seçenekleri elbette isteğe bağlıdır ve isteklerinize göre özelleştirilebilir.


Tarih seçici ekleme

Datepicker örneklemesi. Bu 90 yıl önce ve günümüze kadar gidiyor. Özellikle defaultDate, minDate ve maxDate seçeneklerini ayarlarsanız giriş alanını doğru tutmanıza yardımcı olur, ancak bunu yapmazsanız işleyebilir. Seçtiğiniz herhangi bir tarihle çalışacaktır.

        $('#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('');
    //    })
    //)
    ;

Bir ay seçici ekleme

Monthpicker.js dosyasını ve monthpicker.css dosyasını monthpickers'ı kullanmak istediğiniz sayfaya ekleyin.

Ay seçici örneği Bu ay seçiciden alınan değer, her zaman seçilen ayın İLK günüdür. İçinde bulunulan ayda başlar ve 100 yıl ile 10 yıl arasında değişebilir.

    $('#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('');
    //    })
    //)
    ;

Bu kadar! Bir ay seçici yapmak için ihtiyacınız olan tek şey bu.

Bir jsfiddle bununla çalışmak gibi görünmüyor, ama benim için ASP.NET MVC projemde çalışıyor. Sayfanıza bir tarih seçici eklemek için normalde yaptığınız şeyi yapın ve muhtemelen sizin için çalışan bir şeye seçici seçerek (yani $ ("# MyMonthTextBox")) değiştirerek yukarıdaki komut dosyalarını ekleyin.

Umarım bu birine yardımcı olur.

Bazı ekstra tarih ve ay seçici kurulumları için pastebine bağlantılar:

  1. Monthpicker ayın son günü çalışıyor . Bu ay seçiciden aldığınız tarih her zaman ayın son günü olacaktır.

  2. İşbirliği içinde olan iki ay seçici ; 'start' ayın ilk günü, 'end' ayın son günü çalışıyor. Her ikisi de birbirleri tarafından kısıtlanır, bu nedenle 'başlangıçta seçilen aydan önce olan' bitiş 'üzerinde bir ay seçilmesi,' başlangıç'ı 'bitiş' ile aynı ay olacak şekilde değiştirir. Ve tam tersi. İSTEĞE BAĞLI: 'Başlangıç' için bir ay seçerken, 'bitiş' üzerindeki 'minDate' o aya ayarlanır. Bu özelliği kaldırmak için onClose'da bir satırı yorumlayın (yorumları okuyun).

  3. İşbirliğine dayalı iki tarih seçici ; Her ikisi de birbirleri tarafından kısıtlanır, bu nedenle 'başlangıç' üzerinde seçilen tarihten önce olan 'bitiş' tarihini seçmek, 'başlangıç' öğesini 'bitiş' ile aynı ay olacak şekilde değiştirir. Ve tam tersi. İSTEĞE BAĞLI: 'Başlangıç' üzerinde bir tarih seçerken, 'bitiş' üzerindeki 'minDate' o tarihe ayarlanır. Bu özelliği kaldırmak için onClose'da bir satırı yorumlayın (yorumları okuyun).


DatePicker'ı MonthPicker olarak nasıl değiştirdim?

Ben jpery-ui-1.11.1.js onların tarih seçici ile ilgili tüm javascript kodunu aldım, yeni bir js dosyasına yapıştırdı ve aşağıdaki dizeleri değiştirdim:

  • "datepicker" ==> "ay seçici"
  • "Datepicker" ==> "Ayırıcı"
  • "tarih seçici" ==> "ay seçici"
  • "Tarih seçici" ==> "Ay seçici"

Sonra for-loop'un tüm ui-datepicker-calendar div (diğer çözümlerin CSS kullanarak gizlediği div) bölümünü oluşturan kısmını kaldırdım. Bu, _generateHTML: function (inst) içinde bulunabilir.

Şu satırı bulun:

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

Div etiketinden sonra ve söylediği satıra ( dahil değil ) kadar her şeyi işaretleyin :

drawMonth++;

Şimdi mutsuz olacak çünkü bazı şeyleri kapatmamız gerekiyor. Div etiketini daha önce kapattıktan sonra şunu ekleyin:

";

Kod şimdi güzel bir şekilde birleştirilmelidir. Sonunda ne yapmanız gerektiğini gösteren bir kod pasajı:

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

Sonra jpery-ui.css gelen datepickers ile ilgili kodu kopyalayıp yeni bir CSS dosyasına yapıştırdım ve aşağıdaki dizeleri değiştirdim:

  • "datepicker" ==> "ay seçici"

3

datepicker için jQueryUI.com'u kazdıktan sonra, sonucum ve sorunuzun cevabı burada.

İlk olarak, sorunuza hayır derim . JQueryUI datepicker öğesini yalnızca ay ve yıl seçmek için kullanamazsınız. Desteklenmez. Bunun için geri arama işlevi yoktur.

Ancak günleri gizlemek için css kullanarak sadece ay ve yılı görüntülemek için hackleyebilirsiniz .

Başka bir tarih seçici kullanman gerektiğini söyleyebilirim. Roger'ın önerdiği gibi.


3

Tarih seçici sorun ay seçici ile karışık vardı. Ben böyle çözdüm.

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

Herkes birden fazla takvimler için de bu jquery ui bu işlevsellik eklemek çok zor değil. küçültülmüş arama ile:

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

bunu x'in önüne ekle

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

aramak

<table class="ui-datepicker-calendar

ve yerine

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

ayrıca ara

this._defaults={

ile değiştir

this._defaults={justMonth:false,

css için kullanmalısınız:

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

bundan sonra sadece istediğiniz tarih seçici başlangıç ​​işlevlerine gidin ve ayar var sağlamak

$('#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 buradaki anahtar :)



2

BrianS'ın yukarıdaki neredeyse mükemmel tepkisine birkaç ince ayrıntı yaptı:

  1. Ben aslında bu durumda biraz daha okunabilir hale düşünüyorum çünkü gösteri set değeri regexed ettik (her ne kadar biraz farklı bir format kullanıyorum not)

  2. Müşterim hiçbir takvim istemedi, bu yüzden başka bir datepickers etkilemeden bunu yapmak için bir show / hide sınıfı ekledim. IE'de çok dikkat çekici gibi görünen datepicker sönerken tablonun yanıp sönmesini önlemek için sınıfın kaldırılması bir zamanlayıcıdadır.

EDIT: Bununla çözmek için kalan bir sorun, tarih seçici boşaltmak için hiçbir yolu yoktur - alanı temizleyin ve tıklayın ve seçilen tarih ile yeniden doldurulur.

EDIT2: Bunu güzel bir şekilde çözemedim (yani girişin yanında ayrı bir Temizle düğmesi eklemeden), bu yüzden sadece bunu kullanarak sona erdi: https://github.com/thebrowser/jquery.ui.monthpicker - eğer herkes yapabilirse Bunu yapmak için standart UI bir olsun.

    $('.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));
            }
    });

Ayrıca bu stil kuralına da ihtiyacınız var:

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

2

@ User1857829 yanıtını ve onun "jquery benzeri bir eklenti yaklaşımını" beğendim. Bir litte modifikasyonu yaptım, böylece ay veya yılı herhangi bir şekilde değiştirdiğinizde seçici gerçekten tarihi tarihe yazar. Biraz kullandıktan sonra bu davranışı istediğimi fark ettim.

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

Kabul edilen cevapla ilgili bazı zorluklar yaşadım ve başka hiç kimse asgari bir çaba ile temel alınamaz. Bu yüzden, en azından minimum JS kodlama / yeniden kullanılabilirlik standartlarını karşılayana kadar, kabul edilen yanıtın en son sürümünü değiştirmeye karar verdim.

İşte yoludur daha temiz bir çözüm daha 3 (son) baskısında ait Ben Koehler 'ın kabul edilen cevap. Dahası, olacak:

  • yalnızca mm/yyformatla değil, OP'ler dahil diğerleriyle de çalışır MM yy.
  • sayfadaki diğer tarih seçicilerinin takvimini gizlemeyin.
  • örtük ile küresel JS nesnesi kirletmez datestr, month, yearvb değişkenler.

Bunu kontrol et:

$('.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');
    }
});

Ve ihtiyacınız olan diğer her şey etrafta bir yerde aşağıdaki CSS:

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

Bu kadar. Umarım yukarıdakiler daha fazla okuyucular için biraz zaman kazanır.


1
Sadece ve FYI. 'İnst.dpDiv.addClass (' tarih seçici-ay-yıl ');' tarih ayının takvim bölümüne tüm ay-yılı ekler, yani tarih seçici içeren başka tarih alanları varsa, bu nedenle çalışmayı durdururlar. Takvim için yalnızca tek bir div olduğundan, bir '$ ('. Datepicker-month-year '). RemoveClass (' datepicker-month-year ');' geleneksel takvimi gerektiren diğer tarih seçicilere VEYA, odağı kaybettiğinizde sınıfı kaldırın. Ama
api'de

1
Bu herkesin kullanması gereken tam yanıt. Benim için çözülen en büyük sorun, zaten ne olduğuna bakılmaksızın, tarih giriş pop-up'ının her zaman geçerli ay ve yıl olarak varsayılan olmasıydı. Bu cevap düzeltildi.
Alex F

1

Biraz geç yanıt olduğunu biliyorum, ama aynı problemi birkaç gün önce aldım ve güzel ve pürüzsüz bir çözümle geldim. Öncelikle bu büyük tarih seçici bulundu burada

Sonra böyle bir örnekle gelen CSS sınıfını (jquery.calendarPicker.css) güncelledim:

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

.calDay 
{
    display:none;
}

Eklenti, herhangi bir şeyi değiştirdiğinizde DateChanged etkinliğini tetikler, bu nedenle bir günü tıklamamanız önemli değildir (ve bir yıl ve ay seçici olarak iyi uyuyor)

Umarım yardımcı olur!



1

Burada sağlanan çeşitli çözümler denedim ve sadece birkaç açılan çıkışlar istedim iyi çalıştı.

Burada önerilen en iyi (görünüm vb.) 'Seçici' ( https://github.com/thebrowser/jquery.ui.monthpicker ) temelde _generateHTML'nin yeniden yazıldığı eski bir jquery-ui datepicker sürümünün bir kopyasıdır. Ancak, artık mevcut jquery-ui (1.10.2) ile güzel oynamadı ve başka sorunları vardı (esc'de kapanmaz, diğer widget açılışında kapanmaz, sabit kodlu stilleri vardır).

Bu ay seçiciyi düzeltmeye çalışmak yerine, en son tarih seçiciyle aynı işlemi yeniden denemek yerine, mevcut tarih seçicinin ilgili bölümlerine bağlanmaya gittim.

Bu geçersiz kılmayı içerir:

  • _generateHTML (ay seçici işaretlemesi oluşturmak için)
  • parseDate (gün bileşeni olmadığında beğenmediği için),
  • _selectDay (tarih seçici gün değerini almak için .html () kullandığından)

Bu soru biraz eski ve zaten iyi yanıtlanmış olduğundan, bunun nasıl yapıldığını göstermek için sadece _selectDay geçersiz kılma:

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

Belirtildiği gibi, bu eski bir soru, ama yararlı buldum, bu yüzden alternatif bir çözümle geri bildirim eklemek istedim.


0

JQuery v 1.7.2 kullanarak bir monthpicker için, sadece bunu yapan aşağıdaki javascript var

$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'ın çözümü için teşekkürler.

Ancak, datepickers birden çok örnek ile bir sorun vardı, bazıları gün seçimi ile gerekli. Ben Koehler'in çözümü (düzenleme 3'te) çalışır, ancak her durumda gün seçimini gizler. İşte bu sorunu çözen bir güncelleme:

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

onSelectGeri aramayı kullanın ve yıl bölümünü manuel olarak kaldırın ve alandaki metni manuel olarak ayarlayın


3
Bence soruyu okumuyorsun. Aanu "takvimi değil, ayı ve yılı (Mayıs 2010) görüntülemek" istiyor.
Reigel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.