Я використовую інструмент вибору дати jQuery для відображення календаря у всьому додатку. Я хочу знати, чи можу я використовувати його для відображення місяця та року (травень 2010 р.), А не календаря?
Я використовую інструмент вибору дати jQuery для відображення календаря у всьому додатку. Я хочу знати, чи можу я використовувати його для відображення місяця та року (травень 2010 р.), А не календаря?
Відповіді:
Ось хак (оновлений усім файлом .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 для наведеного вище прикладу: http://jsfiddle.net/DBpJe/7755/
EDIT 2 Додає значення місячного року до поля введення лише при натисканні кнопки Готово. Також дозволяє видалити значення поля введення, що неможливо в полі вище http://jsfiddle.net/DBpJe/5103/
EDIT 3
оновлено Краще рішення на основі рішення rexwolf вниз.
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;}
А потім використовуйте Javascript для маніпулювання поведінкою:$("#ui-datepicker-div").addClass('noCalendar');
Цей код працює для мене бездоганно:
<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" />
Вихід:
@ Бен Келер , це префект! Я вніс незначну модифікацію, щоб використання одного примірника вибору дат не раз працювало як очікувалося. Без цієї модифікації дата неправильно розбирається, а попередньо вибрана дата не виділяється.
<!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>
Наведені вище відповіді досить хороші. Моя єдина скарга на те, що ви не можете очистити значення, як тільки воно було встановлено. Також я віддаю перевагу підключенню модуля exte-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();
<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
У мене була така сама потреба сьогодні і я виявив це на github, працює з jQueryUI і має вибір місяця замість днів у календарі
Ось що я придумав. Він приховує календар, не потребуючи додаткового блоку стилів, і додає чітку кнопку для вирішення проблеми неможливості очистити значення, натиснувши на вхід. Також чудово працює з декількома вибирачами місяців на одній сторінці.
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('');
})
);
Мені потрібен був вибральник місяця / року для двох полів (From & To), і коли було вибрано одне, Max / Min було встановлено на іншому ... a la pick the datume of air ticket. У мене виникли проблеми з встановленням 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; }
Я поєднав багато вищезазначених гарних відповідей і дійшов до цього:
$('#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)
});
});
Це доводиться працювати, але стикається з багатьма помилками, тому я був змушений латати в декількох місцях датчика:
if($.datepicker._get(inst, "dateFormat") === "mm/yy")
{
$(".ui-datepicker-calendar").hide();
}
patch1: в _showDatepicker: згладити приховування;
patch2: у _checkOffset: для виправлення позиціонування вибору місяця (інакше, коли поле знаходиться внизу браузера, перевірка зміщення відключена);
patch3: in onClose _hideDatepicker: інакше при закритті поля спалахнуть на дуже короткий період, що дуже дратує.
Я знаю, що моя помилка була далеко не хорошою, але зараз вона працює. Сподіваюся, це допомагає.
Додайте ще одне просте рішення
$(function() {
$('.monthYearPicker').datepicker({
changeMonth: true,
changeYear: true,
showButtonPanel: true,
dateFormat: 'M yy'
}).focus(function() {
var thisCalendar = $(this);
$('.ui-datepicker-calendar').detach();
$('.ui-datepicker-close').click(function() {
var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
thisCalendar.datepicker('setDate', new Date(year, month, 1));
});
});
});
http://jsfiddle.net/tmnasim/JLydp/
Особливості :
Це тільки я або це не працює як слід в IE (8)? Дата змінюється при натисканні кнопки "Готово", але вибирач дати відкриється знову, поки ви фактично не натиснете десь на сторінці, щоб звільнити фокус на полі введення ...
Я шукаю вирішення цього питання.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>
<link rel="stylesheet" type="text/css" media="screen" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/base/jquery-ui.css">
<script type="text/javascript">
$(function() {
$('.date-picker').datepicker( {
changeMonth: true,
changeYear: true,
showButtonPanel: true,
dateFormat: 'MM yy',
onClose: function(dateText, inst) {
var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
$(this).datepicker('setDate', new Date(year, month, 1));
}
});
});
</script>
<style>
.ui-datepicker-calendar {
display: none;
}
</style>
</head>
<body>
<label for="startDate">Date :</label>
<input name="startDate" id="startDate" class="date-picker" />
</body>
</html>
Якщо ви шукаєте місяць для вибору, спробуйте цей 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);
Як і багато інших, я стикався з численними проблемами, намагаючись це зробити, і лише комбінація розміщених рішень, і врешті-решт великий злом, щоб зробити його ідеальним, придумав мені рішення.
Проблеми з іншими рішеннями в цій темі, які я спробував:
Нарешті я знайшов спосіб виправити всі ці проблеми . Перші чотири можна виправити, обережно ставлячись до того, як ви посилаєтесь на підбирачі дат і місяців у їхньому внутрішньому коді, і, звичайно, роблячи оновлення вибраних вручну. Це ви можете бачити в прикладах інстанцій біля нижньої частини. П’яту проблему можна допомогти, додавши якийсь спеціальний код до функцій вибору дати.
ПРИМІТКА. Вам не потрібно використовувати наступні сценарії вибору місяця, щоб виправити перші три проблеми у вашому звичайному виборі дат. Просто використовуйте скрипт для вибору дати внизу цієї публікації.
Тепер, щоб скористатись місячними виборцями та виправити останню проблему, нам потрібно відокремити збирачів дат та виборів місяців. Ми могли б отримати один з небагатьох доповнень jpiker-інтерфейсу jQuery-інтерфейсу користувача, але деяким не вистачає гнучкості / можливостей локалізації, деяким не вистачає підтримки анімації ... так що робити? Розкачайте свій "власний" з коду дати-вибору! Це дає вам повноцінно функціонуючий місяць, з усіма функціональними можливостями дата-вибору, без відображення днів.
Я надав js-скрипт monthpicker та супровідний CSS-скрипт , використовуючи описаний нижче метод, з кодом jQuery-UI v1.11.1. Просто скопіюйте ці фрагменти коду у два нові файли, monthpicker.js та monthpicker.css відповідно.
Якщо ви хочете почитати про досить простий процес, за допомогою якого я перетворив дату вибору в місяць, перейдіть до останнього розділу.
Ці наступні фрагменти коду JavaScript працюють з декількома вибирачами дат та / або місячними виборцями на сторінці без вищезазначених проблем! Виправлено загалом за допомогою "$ (це)." багато :)
Перший сценарій призначений для звичайного вибору дат, а другий - для "нових" місячних.
Подальше коментар. , Який дає змогу створити якийсь елемент для очищення поля введення, викрадений з відповіді Пола Річардса.
Я використовую формат "MM yy" у своєму місячному виборі та формат "yy-mm-dd" у своєму датчику, але це повністю сумісно з усіма форматами , тому ви можете користуватися будь-яким потрібним. Просто змініть параметр 'dateFormat'. Стандартні параметри "showButtonPanel", "showAnim" та "yearRange", звичайно, необов'язкові та підлаштовуються під ваші побажання.
Ідентифікатор вибору дат. Ця іде від 90 років тому і до сьогодні. Це допомагає вам утримувати правильність поля введення, особливо якщо встановити параметри defaultDate, minDate та maxDate, але він може обробити це, якщо цього не зробити. Він буде працювати з будь-якою формою, яку ви вибрали.
$('#MyDateTextBox').datepicker({
dateFormat: 'yy-mm-dd',
changeMonth: true,
changeYear: true,
showButtonPanel: true,
showMonthAfterYear: true,
showWeek: true,
showAnim: "drop",
constrainInput: true,
yearRange: "-90:",
minDate: new Date((new Date().getFullYear() - 90), new Date().getMonth(), new Date().getDate()),
maxDate: new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()),
defaultDate: new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()),
onClose: function (dateText, inst) {
// When onClose is called after we have clicked a day (and not clicked 'Close' or outside the datepicker), the input-field is automatically
// updated with a valid date-string. They will always pass, because minDate and maxDate are already enforced by the datepicker UI.
// This try is to catch and handle the situations, where you open the datepicker, and manually type in an invalid date in the field,
// and then close the datepicker by clicking outside the datepicker, or click 'Close', in which case no validation takes place.
try {
// If datepicker can parse the date using our formatstring, the instance will automatically parse
// and apply it for us (after the onClose is done).
// If the input-string is invalid, 'parseDate' will throw an exception, and go to our catch.
// If the input-string is EMPTY, then 'parseDate' will NOT throw an exception, but simply return null!
var typedDate = $.datepicker.parseDate($(this).datepicker('option', 'dateFormat'), $(this).val());
// typedDate will be null if the entered string is empty. Throwing an exception will force the datepicker to
// reset to the last set default date.
// You may want to just leave the input-field empty, in which case you should replace 'throw "No date selected";' with 'return;'
if (typedDate == null)throw "No date selected";
// We do a manual check to see if the date is within minDate and maxDate, if they are defined.
// If all goes well, the default date is set to the new date, and datepicker will apply the date for us.
var minDate = $(this).datepicker("option", "minDate");
var maxDate = $(this).datepicker("option", "maxDate");
if (minDate !== null && typedDate < minDate) throw "Date is lower than minDate!";
if (maxDate !== null && typedDate > maxDate) throw "Date is higher than maxDate!";
// We update the default date, because the date seems valid.
// We do not need to manually update the input-field, as datepicker has already done this automatically.
$(this).datepicker('option', 'defaultDate', typedDate);
}
catch (err) {
console.log("onClose: " + err);
// Standard behavior is that datepicker does nothing to fix the value of the input field, until you choose
// a new valid date, by clicking on a day.
// Instead, we set the current date, as well as the value of the input-field, to the last selected (and
// accepted/validated) date from the datepicker, by getting its default date. This only works, because
// we manually change the default date of the datepicker whenever a new date is selected, in both 'beforeShow'
// and 'onClose'.
var date = $(this).datepicker('option', 'defaultDate');
$(this).val($.datepicker.formatDate($(this).datepicker('option', 'dateFormat'), date));
$(this).datepicker('setDate', date);
}
},
beforeShow: function (input, inst) {
// beforeShow is particularly irritating when initializing the input-field with a date-string.
// The date-string will be parsed, and used to set the currently selected date in the datepicker.
// BUT, if it is outside the scope of the minDate and maxDate, the text in the input-field is not
// automatically updated, only the internal selected date, until you choose a new date (or, because
// of our onClose function, whenever you click close or click outside the datepicker).
// We want the input-field to always show the date that is currently chosen in our datepicker,
// so we do some checks to see if it needs updating. This may not catch ALL cases, but these are
// the primary ones: invalid date-format; date is too early; date is too late.
try {
// If datepicker can parse the date using our formatstring, the instance will automatically parse
// and apply it for us (after the onClose is done).
// If the input-string is invalid, 'parseDate' will throw an exception, and go to our catch.
// If the input-string is EMPTY, then 'parseDate' will NOT throw an exception, but simply return null!
var typedDate = $.datepicker.parseDate($(this).datepicker('option', 'dateFormat'), $(this).val());
// typedDate will be null if the entered string is empty. Throwing an exception will force the datepicker to
// reset to the last set default date.
// You may want to just leave the input-field empty, in which case you should replace 'throw "No date selected";' with 'return;'
if (typedDate == null)throw "No date selected";
// We do a manual check to see if the date is within minDate and maxDate, if they are defined.
// If all goes well, the default date is set to the new date, and datepicker will apply the date for us.
var minDate = $(this).datepicker("option", "minDate");
var maxDate = $(this).datepicker("option", "maxDate");
if (minDate !== null && typedDate < minDate) throw "Date is lower than minDate!";
if (maxDate !== null && typedDate > maxDate) throw "Date is higher than maxDate!";
// We update the input-field, and the default date, because the date seems valid.
// We also manually update the input-field, as datepicker does not automatically do this when opened.
$(this).val($.datepicker.formatDate($(this).datepicker('option', 'dateFormat'), typedDate));
$(this).datepicker('option', 'defaultDate', typedDate);
}
catch (err) {
// Standard behavior is that datepicker does nothing to fix the value of the input field, until you choose
// a new valid date, by clicking on a day.
// We want the same behavior when opening the datepicker, so we set the current date, as well as the value
// of the input-field, to the last selected (and accepted/validated) date from the datepicker, by getting
// its default date. This only works, because we manually change the default date of the datepicker whenever
// a new date is selected, in both 'beforeShow' and 'onClose', AND have a default date set in the datepicker options.
var date = $(this).datepicker('option', 'defaultDate');
$(this).val($.datepicker.formatDate($(this).datepicker('option', 'dateFormat'), date));
$(this).datepicker('setDate', date);
}
}
})
//.after( // this makes a link labeled "clear" appear to the right of the input-field, which clears the text in it
// $("<a href='javascript: void(0);'>clear</a>").click(function() {
// $(this).prev().val('');
// })
//)
;
Додайте файл monthpicker.js та файл monthpicker.css на сторінку, яку ви хочете використовувати.
Ініціатива вибору місяця Значення, отримане з цього місяця, завжди є ПЕРШИМ днем вибраного місяця. Починається в поточному місяці і становить від 100 років тому і 10 років у майбутньому.
$('#MyMonthTextBox').monthpicker({
dateFormat: 'MM yy',
changeMonth: true,
changeYear: true,
showMonthAfterYear: true,
showAnim: "drop",
constrainInput: true,
yearRange: "-100Y:+10Y",
minDate: new Date(new Date().getFullYear() - 100, new Date().getMonth(), 1),
maxDate: new Date((new Date().getFullYear() + 10), new Date().getMonth(), 1),
defaultDate: new Date(new Date().getFullYear(), new Date().getMonth(), 1),
// Monthpicker functions
onClose: function (dateText, inst) {
var date = new Date(inst.selectedYear, inst.selectedMonth, 1);
$(this).monthpicker('option', 'defaultDate', date);
$(this).monthpicker('setDate', date);
},
beforeShow: function (input, inst) {
if ($(this).monthpicker("getDate") !== null) {
// Making sure that the date set is the first of the month.
if($(this).monthpicker("getDate").getDate() !== 1){
var date = new Date(inst.selectedYear, inst.selectedMonth, 1);
$(this).monthpicker('option', 'defaultDate', date);
$(this).monthpicker('setDate', date);
}
} else {
// If the date is null, we reset it to the defaultDate. Make sure that the defaultDate is always set to the first of the month!
$(this).monthpicker('setDate', $(this).monthpicker('option', 'defaultDate'));
}
},
// Special monthpicker function!
onChangeMonthYear: function (year, month, inst) {
$(this).val($.monthpicker.formatDate($(this).monthpicker('option', 'dateFormat'), new Date(year, month - 1, 1)));
}
})
//.after( // this makes a link labeled "clear" appear to the right of the input-field, which clears the text in it
// $("<a href='javascript: void(0);'>clear</a>").click(function() {
// $(this).prev().val('');
// })
//)
;
Це воно! Ось і все, що потрібно, щоб зробити місячний підбір.
Я не можу зробити з цим роботу jsfiddle, але це працює для мене в моєму проекті ASP.NET MVC. Просто виконайте те, що ви зазвичай робите, щоб додати дату вибору дати на свою сторінку, і включіть описані вище сценарії, можливо, змінивши селектор (що означає $ ("# MyMonthTextBox")) на щось, що працює для вас.
Я сподіваюся, що це комусь допоможе.
Вибір місяця працює в останній день місяця . Дата, яку ви отримаєте від цього місяця, завжди буде останнім днем місяця.
Два співпрацівники, що співпрацюють ; 'start' працює з першого числа місяця, а 'end' працює над останнім місяцем. Вони обидва обмежені один одним, тому вибір місяця на "кінець", який знаходиться до вибраного місяця на "старт", змінить "початок" таким же місяцем, що і "кінець". І навпаки. ОПЦІОНАЛЬНО: Коли вибираєте місяць на "старт", "minDate" on "end" встановлюється на цей місяць. Щоб видалити цю функцію, прокоментуйте один рядок у onClose (прочитайте коментарі).
Два співавтори, які співпрацюють ; Вони обидва обмежені один одним, тому вибір дати "закінчення", що передує вибраній даті "старту", змінить "початок" таким же місяцем, що і "кінець". І навпаки. ОПЦІОНАЛЬНО: Коли ви вибираєте дату на "старт", "minDate" on "end" встановлюється на цю дату. Щоб видалити цю функцію, прокоментуйте один рядок у onClose (прочитайте коментарі).
Я взяв увесь код JavaScript від jquery-ui-1.11.1.js, що стосується їх вибору дат, вставив його в новий js-файл і замінив такі рядки:
Потім я видалив частину for-loop, яка створює весь поділ ui-datepicker-Calendar (div, який інші рішення приховують за допомогою CSS). Це можна знайти у функції _generateHTML: (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, що стосується доборщиків дат, у новий CSS-файл, і замінив наступні рядки:
після копання jQueryUI.com для датника, ось мій висновок та відповідь на ваше запитання.
Не перший, я б сказав , НЕ на ваше запитання. Ви не можете використовувати панель вибору дати jQueryUI лише для вибору місяця та року. Він не підтримується. Він не має для цього функції зворотного дзвінка.
Але ви можете зламати його, щоб відображати лише місяць і рік, використовуючи css, щоб приховати дні і т. Д. І я думаю, не буде сенсу все-таки викликати необхідність натискання дат, щоб вибрати дату.
Я можу сказати, що ви просто повинні використовувати інший підбірник дат. Як і те, що запропонував Роджер.
У мене була проблема з вибором дати, змішаною з вибором місяця. Я вирішив це так.
$('.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();
}
});
Якщо хтось хоче, що також для кількох календарів не дуже важко додати цю функціональність до 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;
}
після цього все зроблено, просто перейдіть до потрібних функцій initpіint і виберіть налаштування 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
тут ключовий :)
Про нас: http://www.mattkruse.com/javascript/calendarpopup/
Виберіть приклад вибору місяця
Вище вдосконалено майже ідеальну відповідь BrianS:
Я повторно застосував набір значень у шоу, тому що я думаю, що це насправді робить його трохи більш читабельним у цьому випадку (хоча зауважте, я використовую трохи інший формат)
Мій клієнт не хотів календаря, тому я додав додаток для показу / приховування класу, щоб зробити це, не зачіпаючи жодних інших вибирачів дат. Вилучення класу відбувається за таймером, щоб уникнути резервного копіювання таблиці, коли фіксатор дати згасає, що, здається, дуже помітно в IE.
РЕДАКТИРУВАННЯ: Залишилася вирішити цю проблему, що немає способу спорожнити датчик - очистіть поле та натисніть геть, і воно переповниться вибраною датою.
EDIT2: мені не вдалося вирішити це добре (тобто без додавання окремої кнопки Очистити поруч із входом), тому в кінцевому підсумку просто скориставшись цим: https://github.com/thebrowser/jquery.ui.monthpicker - якщо хто може отримати стандартний інтерфейс користувача, щоб зробити це, що було б дивним.
$('.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
}
Мені сподобалась відповідь @ 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);
}
У мене були певні труднощі з прийнятою відповіддю, і жоден інший не міг використовуватись з мінімальними зусиллями як основу. Отже, я вирішив підробити останню версію прийнятої відповіді, поки вона не задовольнить принаймні мінімальні стандарти кодування / повторного використання JS.
Ось спосіб вирішення набагато чистіше , ніж третій (останній) випуск з Ben Koehler загальноприйнятому відповідь «s. Більше того, це:
mm/yy
форматом, але і з будь-яким іншим, включаючи ОП MM yy
.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;
}
Це воно. Сподіваємось, що вищесказане заощадить час для подальших читачів.
Я знаю, що це трохи пізня відповідь, але я отримав ту саму проблему за пару днів до цього, і я прийшов із гарним та рівним рішенням. По- перше , я знайшов цю вибору дати тут
Тоді я щойно оновив клас CSS (jquery.calendarPicker.css), який поставляється з таким прикладом:
.calMonth {
/*border-bottom: 1px dashed #666;
padding-bottom: 5px;
margin-bottom: 5px;*/
}
.calDay
{
display:none;
}
Плагін запускає DateChanged події, коли ви щось змінюєте, тому не має значення, що ви не натискаєте на день (і це підходить як вибір року та місяця)
Сподіваюся, це допомагає!
Мені також потрібен був вибральник місяця. Я зробив простий з роком на заголовку та 3 рядами за 4 місяці нижче. Перевірте це: Простий місячний рік вибору з jQuery .
Я спробував різні запропоновані тут рішення, і вони спрацювали прекрасно, якщо ви просто хотіли падіння падіння.
Найкращий (на вигляд і т. Д. ) 'Picker' ( https://github.com/thebrowser/jquery.ui.monthpicker ), запропонований тут, - це в основному копія старої версії jquery-ui datepicker із переписаним _generateHTML. Однак я виявив, що він більше не чудово грає з поточним jquery-ui (1.10.2) і мав інші проблеми (не закривається на esc, не закривається на відкритті інших віджетів, має стилі з твердим кодом).
Замість того, щоб намагатися виправити цей місяць, і не намагатися повторити той самий процес із останньою датою вибору, я пішов із підключенням до відповідних частин існуючого вибору дат.
Це включає переосмислення:
Оскільки це запитання трохи старе і вже добре відповів, ось лише перелік _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);
};
Як було сказано, це старе питання, але я вважав його корисним, тому хотів додати зворотній зв'язок із альтернативним рішенням.
для місяця, за допомогою 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']
});
Дякуємо за рішення Бена Келера.
Однак у мене виникли проблеми з декількома екземплярами вибирачів дат, деякі з них потребували підбору дня. Рішення Бена Келера (у редакції 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");
}
}
});
Використовуйте onSelect
зворотний дзвінок і видаліть частину року вручну та встановіть текст у полі вручну