Sto utilizzando il selettore di date jQuery per visualizzare il calendario in tutta la mia app. Voglio sapere se posso usarlo per visualizzare il mese e l'anno (maggio 2010) e non il calendario?
Sto utilizzando il selettore di date jQuery per visualizzare il calendario in tutta la mia app. Voglio sapere se posso usarlo per visualizzare il mese e l'anno (maggio 2010) e non il calendario?
Risposte:
Ecco un trucco (aggiornato con l'intero file .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>
EDIT jsfiddle per l'esempio sopra: http://jsfiddle.net/DBpJe/7755/
MODIFICA 2 Aggiunge il valore dell'anno del mese alla casella di input solo facendo clic sul pulsante Fine. Permette anche di eliminare i valori della casella di input, cosa impossibile nel campo sopra http://jsfiddle.net/DBpJe/5103/
EDIT 3 ha
aggiornato la soluzione migliore basata sulla soluzione di rexwolf inattiva.
http://jsfiddle.net/DBpJe/5106
$(this).val($.datepicker.formatDate('MM yy', new Date(year, month, 1)));
#ui-datepicker-div.noCalendar .ui-datepicker-calendar, #ui-datepicker-div.noCalendar .ui-datepicker-header a {display: none;} #ui-datepicker-div.noCalendar .ui-datepicker-header .ui-datepicker-title{width: 100%; margin: 0;}
E quindi utilizzare Javascript per manipolare il comportamento:$("#ui-datepicker-div").addClass('noCalendar');
Questo codice funziona perfettamente per me:
<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" />
L'output è:
@Ben Koehler , è perfetto ! Ho apportato una modifica minore in modo che l'utilizzo di una singola istanza del selettore data più volte funzioni come previsto. Senza questa modifica la data viene analizzata in modo errato e la data precedentemente selezionata non viene evidenziata.
<!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>
Le risposte sopra sono abbastanza buone. La mia unica lamentela è che non è possibile cancellare il valore una volta impostato. Inoltre preferisco l'approccio ext-jquery-like-a-plugin.
Questo funziona perfettamente per me:
$.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);
}
Quindi invoca in questo modo:
$('input.monthYearPicker').monthYearPicker();
<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));
}
}
});
});
Questo risolverà il problema =) Ma volevo il timeFormat yyyy-mm
Ho provato solo in FF4 però
Ho avuto lo stesso bisogno oggi e l'ho trovato su github, funziona con jQueryUI e ha il selettore del mese al posto dei giorni nel calendario
Ecco cosa mi è venuto in mente. Nasconde il calendario senza bisogno di un blocco di stile in più e aggiunge un pulsante Cancella per affrontare il problema di non poter cancellare il valore dopo aver fatto clic sull'input. Funziona bene anche con più mittenti nella stessa pagina.
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('');
})
);
Avevo bisogno di un selettore Mese / Anno per due campi (Da e A) e quando uno è stato scelto il Max / Min era impostato sull'altro ... alla selezione delle date dei biglietti aerei. Avevo problemi a impostare il massimo e il minimo ... le date dell'altro campo sarebbero state cancellate. Grazie a molti dei post precedenti ... Alla fine l'ho capito. Devi impostare opzioni e date in un ordine molto specifico.
Vedi questo violino per la soluzione completa: mese / anno Picker @ JSFiddle
Codice:
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));
}
}
});
Aggiungilo anche a un blocco di stile come menzionato sopra:
.ui-datepicker-calendar { display: none !important; }
Ho combinato molte delle buone risposte sopra e arrivo su questo:
$('#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)
});
});
Questo ha dimostrato di funzionare ma di fronte a molti bug, quindi sono stato costretto a rattoppare in diversi punti di Datepicker:
if($.datepicker._get(inst, "dateFormat") === "mm/yy")
{
$(".ui-datepicker-calendar").hide();
}
patch1: in _showDatepicker: per levigare la pelle;
patch2: in _checkOffset: per correggere il posizionamento del selettore mese (altrimenti quando il campo è nella parte inferiore del browser, il controllo offset è disattivato);
patch3: in onClose di _hideDatepicker: altrimenti quando si chiudono i campi della data lampeggiano per un periodo molto breve che è molto fastidioso.
So che la mia correzione era tutt'altro che buona, ma per ora funziona. Spero che sia d'aiuto.
Aggiungi un'altra soluzione semplice
$(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/
Caratteristiche :
Sono solo io o non funziona come dovrebbe in IE (8)? La data cambia quando si fa clic su Fine, ma il datepicker si apre di nuovo, fino a quando non si fa effettivamente clic da qualche parte nella pagina per perdere il focus sul campo di input ...
Sto cercando di risolvere questo.
<!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>
Se stai cercando un selezionatore di mesi, prova questo jquery.mtz.monthpicker
Questo ha funzionato bene per me.
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);
Come molti altri, ho riscontrato numerosi problemi nel tentativo di farlo, e solo una combinazione delle soluzioni pubblicate, e alla fine un grande hack per renderlo perfetto, ha mi fornito una soluzione.
Problemi con altre soluzioni in questo thread che ho provato:
Ho finalmente trovato il modo di risolvere tutti questi problemi . I primi quattro possono essere risolti semplicemente facendo attenzione a come si fa riferimento ai propri data e mese nel loro codice interno e, naturalmente, facendo un aggiornamento manuale dei propri selettori. Questo è visibile negli esempi di istanza nella parte inferiore. Il quinto problema può essere risolto aggiungendo del codice personalizzato alle funzioni datepicker.
NOTA: NON è necessario utilizzare i seguenti script di mesepicker per correggere i primi tre problemi nel normale datepicker. Usa semplicemente lo script di istanza di datepicker nella parte inferiore di questo post.
Ora, per usare i mestruatori e correggere l'ultimo problema, abbiamo bisogno di separare i datepicker e i monthpicker. Potremmo ottenere uno dei pochi add-on jpery-UI del mesepicker là fuori, ma alcuni mancano di flessibilità / capacità di localizzazione, altri mancano di supporto per l'animazione ... quindi, cosa fare? Crea il tuo "proprio" dal codice datepicker! Questo ti dà un mesepicker perfettamente funzionante, con tutte le funzionalità del datepicker, solo senza la visualizzazione dei giorni.
Ho fornito un js-script di Monthpicker e lo script CSS di accompagnamento , utilizzando il metodo descritto di seguito, con il codice jQuery-UI v1.11.1. Basta copiare questi frammenti di codice in due nuovi file, monthpicker.js e monthpicker.css, rispettivamente.
Se vuoi leggere il processo piuttosto semplice con cui ho convertito il datepicker in un mesepicker, scorri verso il basso fino all'ultima sezione.
Questi seguenti frammenti di codice javascript funzionano con più datepicker e / o monthpicker sulla pagina, senza i problemi di cui sopra! Risolto generalmente usando '$ (questo).' Un sacco :)
Il primo script è per un normale datepicker e il secondo è per i "nuovi" monthpicker.
Il .after fuori commento , che consente di creare qualche elemento per cancellare il campo di input, viene rubato dalla risposta di Paul Richards.
Sto usando il formato "MM yy" nel mio monthpicker e il formato "yy-mm-dd" nel mio datepicker, ma questo è completamente compatibile con tutti i formati , quindi sei libero di usare quello che vuoi. Cambia semplicemente l'opzione 'dateFormat'. Le opzioni standard 'showButtonPanel', 'showAnim' e 'yearRange' sono ovviamente opzionali e personalizzabili secondo i tuoi desideri.
Istanza di Datepicker. Questo risale a 90 anni fa e ai giorni nostri. Ti aiuta a mantenere corretto il campo di input, specialmente se imposti le opzioni defaultDate, minDate e maxDate, ma può gestirlo in caso contrario. Funzionerà con qualsiasi data Formatta che scegli.
$('#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('');
// })
//)
;
Includere il file monthpicker.js e il file monthpicker.css nella pagina in cui si desidera utilizzare monthpickers.
Istantanea di Monthpicker Il valore recuperato da questo monthpicker è sempre il PRIMO giorno del mese selezionato. Inizia il mese corrente e va da 100 anni fa e 10 anni nel futuro.
$('#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('');
// })
//)
;
Questo è tutto! Questo è tutto ciò di cui hai bisogno per creare un mesepicker.
Non riesco a far funzionare un jsfiddle con questo, ma funziona per me nel mio progetto ASP.NET MVC. Fai semplicemente quello che fai normalmente per aggiungere un datepicker alla tua pagina e incorpora gli script sopra, possibilmente cambiando il selettore (che significa $ ("# MyMonthTextBox")) in qualcosa che funzioni per te.
Spero che questo aiuti qualcuno.
Monthpicker lavora l'ultimo giorno del mese . La data che riceverai da questo mesepicker sarà sempre l'ultimo giorno del mese.
Due collaboratori di mese che collaborano ; 'start' sta lavorando il primo del mese e 'end' sta lavorando l'ultimo del mese. Entrambi sono limitati l'uno dall'altro, quindi scegliendo un mese su "fine" che è prima del mese selezionato su "inizio", cambierà "inizio" in modo che sia lo stesso mese di "fine". E viceversa. FACOLTATIVO: quando si seleziona un mese su "inizio", la "data minima" su "fine" viene impostata su quel mese. Per rimuovere questa funzione, commenta una riga in onClose (leggi i commenti).
Due datepicker collaboranti ; Entrambi sono limitati l'uno dall'altro, quindi scegliendo una data su "fine" che è precedente alla data selezionata su "inizio", cambierà "inizio" in modo che sia lo stesso mese di "fine". E viceversa. FACOLTATIVO: quando si seleziona una data su "inizio", la "data minima" su "fine" viene impostata su quella data. Per rimuovere questa funzione, commenta una riga in onClose (leggi i commenti).
Ho preso tutto il codice javascript da jquery-ui-1.11.1.js relativo al loro datepicker, incollato in un nuovo file js e sostituito le seguenti stringhe:
Quindi ho rimosso la parte del for-loop che crea l'intero div ui-datepicker-calendar (il div che altre soluzioni nascondono usando i CSS). Questo può essere trovato in _generateHTML: function (inst).
Trova la riga che dice:
"</div><table class='ui-datepicker-calendar'><thead>" +
Contrassegna tutto da dopo il div-tag di chiusura e fino a (e non incluso) la linea dove dice:
drawMonth++;
Ora sarà infelice perché dobbiamo chiudere alcune cose. Dopo aver chiuso il div-tag di prima, aggiungi questo:
";
Il codice ora dovrebbe essere unito bene insieme. Ecco uno snippet di codice che mostra cosa avresti dovuto finire:
...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...
Quindi ho copiato / incollato il codice da jquery-ui.css relativo ai datepicker in un nuovo file CSS e ho sostituito le seguenti stringhe:
dopo aver scavato jQueryUI.com per datepicker, ecco la mia conclusione e la risposta alla tua domanda.
Innanzitutto, direi di no alla tua domanda. Non è possibile utilizzare datepicker jQueryUI solo per selezionare mese e anno. Non è supportato Non ha alcuna funzione di callback per questo.
Ma puoi hackerarlo per visualizzare solo mese e anno usando css per nascondere i giorni, ecc. E penso che non abbia ancora senso perché hai bisogno delle date da cliccare per scegliere una data.
Posso dire che devi solo usare un altro datepicker. Come quello che Roger ha suggerito.
Ho avuto il problema della selezione della data mescolata con la selezione del mese. L'ho risolto così.
$('.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();
}
});
Se qualcuno lo desidera anche per più calendari, non è molto difficile aggiungere questa funzionalità a jquery ui. con ricerca minimizzata per:
x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?f:n:"")+(
aggiungi questo davanti a x
var accl = ''; if(this._get(a,"justMonth")) {accl = ' ui-datepicker-just_month';}
Cercare
<table class="ui-datepicker-calendar
e sostituirlo con
<table class="ui-datepicker-calendar'+accl+'
anche cercare
this._defaults={
sostituirlo con
this._defaults={justMonth:false,
per css dovresti usare:
.ui-datepicker table.ui-datepicker-just_month{
display: none;
}
dopo che tutto è fatto basta andare alle funzioni init datepicker desiderate e fornire le impostazioni 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
è la chiave qui :)
Per quanto riguarda: http://www.mattkruse.com/javascript/calendarpopup/
Seleziona l'esempio di selezione del mese
Ho apportato alcuni perfezionamenti alla risposta quasi perfetta di BrianS sopra:
Ho riproposto il valore impostato in mostra perché penso che in realtà lo renda leggermente più leggibile in questo caso (anche se nota che sto usando un formato leggermente diverso)
Il mio cliente non voleva un calendario, quindi ho aggiunto un'aggiunta alla classe show / hide per farlo senza influenzare altri datepicker. La rimozione della classe è su un timer per evitare che il tavolo lampeggi di nuovo mentre il datepicker svanisce, il che sembra essere molto evidente in IE.
EDIT: un problema rimasto da risolvere con questo è che non c'è modo di svuotare il datepicker: cancellare il campo e fare clic e si ripopola con la data selezionata.
EDIT2: non sono riuscito a risolverlo bene (cioè senza aggiungere un pulsante Clear separato accanto all'input), quindi ho finito per usarlo: https://github.com/thebrowser/jquery.ui.monthpicker - se qualcuno può ottenere l'interfaccia utente standard per farlo sarebbe sorprendente.
$('.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));
}
});
È inoltre necessaria questa regola di stile:
#ui-datepicker-div.month_only .ui-datepicker-calendar {
display:none
}
Mi è piaciuta la risposta di @ user1857829 e il suo approccio "ext-jquery-like-a-plugin". Ho appena fatto una modifica di litte in modo che quando cambi mese o anno in qualche modo il selettore scriva effettivamente la data nel campo. Ho scoperto che mi piacerebbe quel comportamento dopo averlo usato un po '.
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);
}
Ho avuto alcune difficoltà con la risposta accettata e nessun altro poteva essere usato con un minimo sforzo come base. Così, ho deciso di modificare l'ultima versione della risposta accettata fino a quando non soddisfi almeno gli standard minimi di codifica / riusabilità di JS.
Ecco una soluzione molto più pulita della terza (ultima) edizione di risposta accettata da Ben Koehler . Inoltre, sarà:
mm/yy
formato, ma con qualsiasi altro, inclusi gli OP MM yy
.datestr
,
month
, year
ecc variabili.Controlla:
$('.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');
}
});
E tutto il necessario è il seguente CSS da qualche parte in giro:
.datepicker-month-year .ui-datepicker-calendar {
display: none;
}
Questo è tutto. Spero che quanto sopra farà risparmiare un po 'di tempo per ulteriori lettori.
So che è una risposta un po 'in ritardo, ma ho avuto lo stesso problema un paio di giorni prima e sono arrivato con una soluzione piacevole e fluida. Per prima cosa ho trovato questo fantastico selettore di date qui
Quindi ho appena aggiornato la classe CSS (jquery.calendarPicker.css) che viene fornita con l'esempio in questo modo:
.calMonth {
/*border-bottom: 1px dashed #666;
padding-bottom: 5px;
margin-bottom: 5px;*/
}
.calDay
{
display:none;
}
Il plugin genera un evento DateChanged quando si cambia qualcosa, quindi non importa che non si stia facendo clic su un giorno (e si adatta bene come selettore di anno e mese)
Spero che sia d'aiuto!
Avevo anche bisogno di un mese di selezione. Ne ho fatto uno semplice con l'anno in testata e 3 file di 4 mesi in basso. Dai un'occhiata: Semplice selettore mensile con jQuery .
Ho provato le varie soluzioni fornite qui e hanno funzionato bene se volevi semplicemente un paio di menu a discesa.
Il miglior 'picker' (in apparenza ecc.) ( Https://github.com/thebrowser/jquery.ui.monthpicker ) suggerito qui è fondamentalmente una copia di una vecchia versione di datepicker jquery-ui con il _generateHTML riscritto. Tuttavia, ho scoperto che non funziona più bene con l'attuale jquery-ui (1.10.2) e ho avuto altri problemi (non si chiude su esc, non si chiude all'apertura di altri widget, ha stili hardcoded).
Piuttosto che tentare di correggere quel mesepicker e piuttosto di riprovare lo stesso processo con l'ultimo datepicker, sono andato con l'aggancio alle parti pertinenti del selettore di date esistente.
Ciò comporta l'override:
Poiché questa domanda è un po 'vecchia e ha già una buona risposta, ecco solo l'override di _selectDay per mostrare come è stato fatto:
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);
};
Come detto, questa è una vecchia domanda, ma l'ho trovato utile, quindi volevo aggiungere un feedback con una soluzione alternativa.
per un mese, usando JQuery v 1.7.2, ho il seguente javascript che sta facendo proprio questo
$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']
});
Grazie per la soluzione di Ben Koehler.
Tuttavia, ho avuto un problema con più istanze di datepicker, alcune delle quali necessarie con la selezione del giorno. La soluzione di Ben Koehler (nella modifica 3) funziona, ma nasconde la selezione del giorno in tutti i casi. Ecco un aggiornamento che risolve questo problema:
$('.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");
}
}
});
Utilizzare onSelect
richiamare e rimuovere manualmente la parte dell'anno e impostare manualmente il testo nel campo