Tôi đang sử dụng công cụ chọn ngày jQuery để hiển thị lịch trên toàn bộ ứng dụng của mình. Tôi muốn biết nếu tôi có thể sử dụng nó để hiển thị tháng và năm (tháng 5 năm 2010) chứ không phải lịch?
Tôi đang sử dụng công cụ chọn ngày jQuery để hiển thị lịch trên toàn bộ ứng dụng của mình. Tôi muốn biết nếu tôi có thể sử dụng nó để hiển thị tháng và năm (tháng 5 năm 2010) chứ không phải lịch?
Câu trả lời:
Đây là một bản hack (được cập nhật với toàn bộ tệp .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 cho ví dụ trên: http://jsfiddle.net/DBpJe/7755/
EDIT 2 Thêm giá trị năm tháng vào hộp nhập chỉ khi nhấp vào nút Xong. Đồng thời cho phép xóa các giá trị hộp đầu vào, không thể thực hiện được trong trường trên http://jsfiddle.net/DBpJe/5103/
EDIT 3 đã
cập nhật Giải pháp tốt hơn dựa trên giải pháp của 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;}
Và sau đó sử dụng Javascript để thao tác hành vi:$("#ui-datepicker-div").addClass('noCalendar');
Đây đang được làm việc một cách hoàn hảo với tôi:
<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" />
Đầu ra là:
@Ben Koehler , đó là hoàn hảo! Tôi đã thực hiện một sửa đổi nhỏ để sử dụng một phiên bản của trình chọn ngày nhiều lần hoạt động như mong đợi. Không có sửa đổi này, ngày được phân tích cú pháp không chính xác và ngày đã chọn trước đó không được tô sáng.
<!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>
Các câu trả lời trên là khá tốt. Khiếu nại duy nhất của tôi là bạn không thể xóa giá trị sau khi được đặt. Ngoài ra tôi thích cách tiếp cận mở rộng-jquery-like-a-plugin.
Điều này làm việc hoàn hảo cho tôi:
$.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);
}
Sau đó gọi như vậy:
$('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));
}
}
});
});
Điều này sẽ giải quyết vấn đề =) Nhưng tôi muốn timeFormat yyyy-mm
Chỉ thử trong FF4
Tôi đã có nhu cầu tương tự ngày hôm nay và tìm thấy điều này trên github, hoạt động với jQueryUI và có công cụ chọn tháng thay cho ngày trong lịch
Đây là những gì tôi nghĩ ra. Nó ẩn lịch mà không cần một khối kiểu bổ sung và thêm một nút rõ ràng để giải quyết vấn đề không thể xóa giá trị khi bạn nhấp vào đầu vào. Cũng hoạt động độc đáo với nhiều tháng trên cùng một trang.
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('');
})
);
Tôi cần một công cụ chọn Tháng / Năm cho hai trường (Từ & Đến) và khi một trường được chọn, Tối đa / Tối thiểu được đặt trên một trường khác ... một ngày chọn vé máy bay. Tôi gặp vấn đề khi đặt tối đa và tối thiểu ... ngày của trường khác sẽ bị xóa. Nhờ một số bài viết trên ... cuối cùng tôi đã tìm ra nó. Bạn phải đặt tùy chọn và ngày theo thứ tự rất cụ thể.
Xem câu đố này để biết giải pháp đầy đủ: Bộ chọn tháng / năm @ JSFiddle
Mã số:
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));
}
}
});
Đồng thời thêm phần này vào một khối kiểu như đã đề cập ở trên:
.ui-datepicker-calendar { display: none !important; }
Tôi đã kết hợp nhiều câu trả lời hay ở trên và đi đến đây:
$('#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)
});
});
Điều này đã được chứng minh là hoạt động nhưng phải đối mặt với nhiều lỗi, vì vậy tôi buộc phải vá ở một số nơi hẹn hò:
if($.datepicker._get(inst, "dateFormat") === "mm/yy")
{
$(".ui-datepicker-calendar").hide();
}
patch1: in _showDatepicker: để làm mịn ẩn;
patch2: in _check Offerset: để sửa vị trí của bộ chọn tháng (nếu không, khi trường nằm ở cuối trình duyệt, kiểm tra bù sẽ tắt);
patch3: in on Đóng của _ leatherDatepicker: nếu không, khi đóng các trường ngày sẽ nhấp nháy trong một khoảng thời gian rất ngắn rất khó chịu.
Tôi biết cách khắc phục của tôi không tốt lắm nhưng hiện tại nó đã hoạt động. Hy vọng nó giúp.
Thêm một giải pháp đơn giản hơn
$(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/
Các tính năng :
Có phải chỉ tôi hoặc điều này không hoạt động như trong IE (8)? Ngày thay đổi khi nhấp xong, nhưng công cụ hẹn hò sẽ mở lại, cho đến khi bạn thực sự nhấp vào đâu đó trong trang để mất tập trung vào trường nhập liệu ...
Tôi đang tìm cách giải quyết điều này.
<!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>
Nếu bạn đang tìm kiếm một công cụ chọn tháng, hãy thử jquery.mtz.monthpicker này
Điều này làm việc cho tôi tố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);
Giống như nhiều người khác, tôi đã gặp phải nhiều vấn đề khi cố gắng thực hiện điều này và chỉ một sự kết hợp của các giải pháp được đăng, và cuối cùng là một vụ hack lớn để làm cho nó hoàn hảo, đã mang lại cho tôi một giải pháp.
Các vấn đề với các giải pháp khác trong chủ đề này mà tôi đã thử:
Cuối cùng tôi đã tìm ra cách khắc phục tất cả những vấn đề này . Bốn cái đầu tiên có thể được sửa một cách đơn giản bằng cách cẩn thận về cách bạn tham chiếu ngày và tháng của bạn trong mã nội bộ của họ, và tất nhiên là thực hiện một số cập nhật thủ công các công cụ chọn của bạn. Điều này bạn có thể thấy trong các ví dụ khởi tạo gần phía dưới. Vấn đề thứ năm có thể được giúp đỡ bằng cách thêm một số mã tùy chỉnh vào các hàm datepicker.
LƯU Ý: Bạn KHÔNG cần phải sử dụng các tập lệnh tháng tháng sau để khắc phục ba vấn đề đầu tiên trong công cụ hẹn hò thông thường của bạn. Đơn giản chỉ cần sử dụng tập lệnh khởi tạo datepicker gần cuối bài này.
Bây giờ, để sử dụng công cụ quét tháng và khắc phục sự cố cuối cùng, chúng ta cần tách riêng các công cụ hẹn giờ và công cụ kiểm tra tháng. Chúng ta có thể nhận được một trong số ít addonicker jQuery-UI ngoài kia, nhưng một số thiếu tính linh hoạt / khả năng bản địa hóa, một số thiếu hỗ trợ hoạt hình ... vậy, phải làm sao? Cuộn "của riêng bạn" từ mã ngày tháng! Điều này mang lại cho bạn một công cụ tìm kiếm đầy đủ chức năng, với tất cả các chức năng của công cụ hẹn hò, mà không cần hiển thị ngày.
Tôi đã cung cấp một monthpicker js-kịch bản và đi kèm CSS-kịch bản , sử dụng phương pháp mô tả dưới đây, với mã v1.11.1 jQuery-UI. Chỉ cần sao chép các đoạn mã này vào hai tệp mới, tương ứng là thángpicker.js và thángpicker.css.
Nếu bạn muốn đọc về quy trình khá đơn giản, qua đó tôi đã chuyển đổi công cụ hẹn hò thành công cụ tìm tháng, hãy cuộn xuống phần cuối cùng.
Các đoạn mã javascript sau đây hoạt động với nhiều mã ngày và / hoặc mã vạch trên trang, mà không gặp phải các vấn đề đã nói ở trên! Đã sửa lỗi bằng cách sử dụng '$ (cái này).' rất nhiều :)
Kịch bản đầu tiên dành cho một người hẹn hò bình thường, và kịch bản thứ hai dành cho những người khai thác "mới".
Các out-nhận xét .Sau , cho phép bạn tạo ra một số yếu tố để xóa các đầu vào trường, bị đánh cắp từ câu trả lời Paul Richards'.
Tôi đang sử dụng định dạng "MM yy" trong tháng của mình và định dạng 'yy-mm-dd' trong công cụ hẹn hò của tôi, nhưng điều này hoàn toàn tương thích với tất cả các định dạng , vì vậy bạn có thể tự do sử dụng bất kỳ định dạng nào bạn muốn. Chỉ cần thay đổi tùy chọn 'dateFormat'. Các tùy chọn tiêu chuẩn 'showButtonPanel', 'showAnim' và 'yearRange' tất nhiên là tùy chọn và tùy chỉnh theo mong muốn của bạn.
Khởi tạo ngày tháng. Điều này đi từ 90 năm trước và cho đến ngày nay. Nó giúp bạn giữ trường đầu vào chính xác, đặc biệt nếu bạn đặt các tùy chọn defaultDate, minDate và maxDate, nhưng nó có thể xử lý nó nếu bạn không. Nó sẽ hoạt động với bất kỳ dateFormat nào bạn chọn.
$('#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('');
// })
//)
;
Bao gồm tệp thángpicker.js và tệp thángpicker.css trong trang bạn muốn sử dụng các tháng.
Khởi tạo hàng tháng Giá trị được lấy từ tháng này, luôn luôn là ngày đầu tiên của tháng được chọn. Bắt đầu từ tháng hiện tại, và dao động từ 100 năm trước và 10 năm trong tương lai.
$('#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('');
// })
//)
;
Đó là nó! Đó là tất cả những gì bạn cần để thực hiện một tháng.
Tôi dường như không thể làm cho một jsfiddle hoạt động với điều này, nhưng nó hoạt động với tôi trong dự án ASP.NET MVC của tôi. Chỉ cần làm những gì bạn thường làm để thêm một công cụ hẹn hò vào trang của bạn và kết hợp các tập lệnh ở trên, có thể bằng cách thay đổi bộ chọn (có nghĩa là $ ("# MyMonthTextBox")) thành thứ phù hợp với bạn.
Tôi hi vọng điêu nay se giup được ai đo.
Tháng làm việc vào ngày cuối cùng của tháng . Ngày bạn nhận được từ tháng này sẽ luôn là ngày cuối cùng của tháng.
Hai tháng tháng hợp tác ; 'Bắt đầu' đang hoạt động vào đầu tháng và 'kết thúc' hoạt động vào cuối tháng. Cả hai đều bị hạn chế bởi nhau, vì vậy, chọn một tháng vào 'kết thúc' trước tháng được chọn vào 'bắt đầu', sẽ thay đổi 'bắt đầu' thành cùng một tháng với 'kết thúc'. Và ngược lại. TÙY CHỌN: Khi chọn một tháng vào 'bắt đầu', 'minDate' trên 'end' được đặt thành tháng đó. Để xóa tính năng này, hãy nhận xét một dòng trong onC Đóng (đọc các bình luận).
Hai người hẹn hò hợp tác ; Cả hai đều bị hạn chế bởi nhau, vì vậy, chọn một ngày vào 'kết thúc' trước ngày được chọn vào 'bắt đầu', sẽ thay đổi 'bắt đầu' thành cùng tháng với 'kết thúc'. Và ngược lại. TÙY CHỌN: Khi chọn một ngày vào 'bắt đầu', 'minDate' trên 'end' được đặt thành ngày đó. Để xóa tính năng này, hãy nhận xét một dòng trong onC Đóng (đọc các bình luận).
Tôi đã lấy tất cả mã javascript từ jquery-ui-1.11.1.js liên quan đến công cụ hẹn hò của họ, dán nó vào tệp js mới và thay thế các chuỗi sau:
Sau đó, tôi đã loại bỏ một phần của vòng lặp for tạo ra toàn bộ div ui-datepicker-calendar (div mà các giải pháp khác ẩn bằng CSS). Điều này có thể được tìm thấy trong _generateHTML: function (inst).
Tìm dòng có nội dung:
"</div><table class='ui-datepicker-calendar'><thead>" +
Đánh dấu mọi thứ từ sau thẻ div đóng và xuống (và không bao gồm) dòng có ghi:
drawMonth++;
Bây giờ nó sẽ không vui vì chúng ta cần phải đóng một số thứ. Sau khi đóng thẻ div từ trước đó, hãy thêm:
";
Các mã bây giờ nên được nối với nhau độc đáo. Đây là đoạn mã hiển thị những gì bạn nên kết thúc với:
...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...
Sau đó, tôi sao chép / dán mã từ jquery-ui.css liên quan đến bộ định ngày vào tệp CSS mới và thay thế các chuỗi sau:
sau khi đào jQueryUI.com cho datepicker, đây là kết luận và câu trả lời cho câu hỏi của bạn.
Đầu tiên, tôi sẽ nói không với câu hỏi của bạn. Bạn không thể sử dụng công cụ hẹn hò jQueryUI để chỉ chọn tháng và năm. Nó không được hỗ trợ. Nó không có chức năng gọi lại cho điều đó.
Nhưng bạn có thể hack nó để chỉ hiển thị tháng và năm bằng cách sử dụng css để ẩn ngày, v.v. Và tôi nghĩ sẽ không có ý nghĩa gì vì bạn vẫn cần phải bấm ngày để chọn ngày.
Tôi có thể nói bạn chỉ cần sử dụng một datepicker khác. Giống như những gì Roger đề nghị.
Tôi đã có vấn đề của bộ chọn ngày trộn với bộ chọn tháng. Tôi đã giải quyết nó như thế.
$('.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();
}
});
Nếu bất cứ ai muốn điều đó cũng cho nhiều lịch, không khó để thêm chức năng này vào jquery ui. với tìm kiếm rút gọn cho:
x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?f:n:"")+(
thêm cái này vào trước x
var accl = ''; if(this._get(a,"justMonth")) {accl = ' ui-datepicker-just_month';}
tìm kiếm
<table class="ui-datepicker-calendar
và thay thế nó bằng
<table class="ui-datepicker-calendar'+accl+'
cũng tìm kiếm
this._defaults={
thay thế bằng
this._defaults={justMonth:false,
Đối với css bạn nên sử dụng:
.ui-datepicker table.ui-datepicker-just_month{
display: none;
}
sau đó, tất cả đã được thực hiện, chỉ cần chuyển đến các hàm init datepicker mong muốn của bạn và cung cấp cài đặt 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
là chìa khóa ở đây :)
Nói về: http://www.mattkruse.com/javascript/calWikipopup/
Chọn ví dụ chọn tháng
Thực hiện một số tinh chỉnh cho phản ứng gần như hoàn hảo của BrianS ở trên:
Tôi đã lấy lại giá trị được đặt trong chương trình vì tôi nghĩ rằng nó thực sự làm cho nó dễ đọc hơn một chút trong trường hợp này (mặc dù lưu ý rằng tôi đang sử dụng một định dạng hơi khác)
Khách hàng của tôi không muốn có lịch vì vậy tôi đã thêm một chương trình bổ sung vào chương trình / ẩn lớp để làm điều đó mà không ảnh hưởng đến bất kỳ công cụ hẹn giờ nào khác. Việc loại bỏ lớp là trên một bộ đếm thời gian để tránh bảng nhấp nháy trở lại khi công cụ hẹn hò mờ dần, điều này dường như rất đáng chú ý trong IE.
EDIT: Một vấn đề còn lại để giải quyết với vấn đề này là không có cách nào để làm trống bộ đếm ngày - xóa trường và nhấp đi và nó sẽ lặp lại với ngày đã chọn.
EDIT2: Tôi đã không quản lý để giải quyết vấn đề này một cách độc đáo (nghĩa là không thêm một nút Clear riêng biệt bên cạnh đầu vào), vì vậy cuối cùng chỉ sử dụng cái này: https://github.com/thebrowser/jquery.ui.monthpicker - nếu có ai có thể có được giao diện người dùng chuẩn để làm điều đó thật tuyệt vời.
$('.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));
}
});
Bạn cũng cần quy tắc phong cách này:
#ui-datepicker-div.month_only .ui-datepicker-calendar {
display:none
}
Tôi thích câu trả lời @ user1857829 và "cách tiếp cận mở rộng jquery-like-a-plugin" của anh ấy. Tôi chỉ thực hiện một sửa đổi litte để khi bạn thay đổi tháng hoặc năm theo bất kỳ cách nào, trình chọn thực sự viết ngày trong trường. Tôi thấy rằng tôi thích hành vi đó sau khi sử dụng nó một chút.
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);
}
Tôi đã có những khó khăn nhất định với câu trả lời được chấp nhận và không ai có thể được sử dụng với nỗ lực tối thiểu làm cơ sở. Vì vậy, tôi quyết định điều chỉnh phiên bản mới nhất của câu trả lời được chấp nhận cho đến khi nó đáp ứng ít nhất các tiêu chuẩn mã hóa / tái sử dụng tối thiểu.
Đây là một giải pháp sạch hơn nhiều so với phiên bản thứ 3 (mới nhất) của câu trả lời được chấp nhận của Ben Koehler . Hơn nữa, nó sẽ:
mm/yy
định dạng, mà với bất kỳ định dạng nào khác, kể cả OP MM yy
.datestr
,
month
, year
vv biến.Kiểm tra xem nó:
$('.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');
}
});
Và mọi thứ khác bạn cần là CSS sau đây ở đâu đó xung quanh:
.datepicker-month-year .ui-datepicker-calendar {
display: none;
}
Đó là nó. Hy vọng những điều trên sẽ tiết kiệm thời gian cho độc giả hơn nữa.
Tôi biết đó là một phản hồi muộn một chút, nhưng tôi đã gặp vấn đề tương tự một vài ngày trước đó và tôi đã đi kèm với một giải pháp tốt đẹp và trơn tru. Đầu tiên tôi tìm thấy công cụ chọn ngày tuyệt vời này ở đây
Sau đó, tôi vừa cập nhật lớp CSS (jquery.calWikiPicker.css) đi kèm với ví dụ như sau:
.calMonth {
/*border-bottom: 1px dashed #666;
padding-bottom: 5px;
margin-bottom: 5px;*/
}
.calDay
{
display:none;
}
Plugin kích hoạt một sự kiện DateChanged khi bạn thay đổi bất cứ điều gì, do đó, không có vấn đề gì khi bạn không nhấp vào một ngày (và nó phù hợp như một công cụ chọn năm và tháng)
Hy vọng nó giúp!
Tôi cũng cần một người chọn tháng. Tôi đã thực hiện một đơn giản với năm trên tiêu đề và 3 hàng 4 tháng dưới đây. Hãy xem thử: Trình chọn hàng tháng đơn giản với jQuery .
Tôi đã thử các giải pháp khác nhau được cung cấp ở đây và chúng hoạt động tốt nếu bạn chỉ muốn một vài lần thả xuống.
'Trình chọn' tốt nhất (về ngoại hình, v.v.) ( https://github.com/thebrowser/jquery.ui.monthpicker ) được đề xuất ở đây về cơ bản là một bản sao của một phiên bản cũ của jquery-ui với _generateHTML được viết lại. Tuy nhiên, tôi thấy nó không còn chơi độc đáo với jquery-ui hiện tại (1.10.2) và có các vấn đề khác (không đóng trên esc, không đóng trên các tiện ích mở khác, có kiểu mã hóa cứng).
Thay vì cố gắng sửa lỗi tháng đó và thay vì đánh lừa quá trình tương tự với công cụ hẹn hò mới nhất, tôi đã đi vào móc vào các phần có liên quan của trình chọn ngày hiện tại.
Điều này liên quan đến ghi đè:
Vì câu hỏi này hơi cũ và đã được trả lời tốt, đây chỉ là phần ghi đè _selectDay để hiển thị cách thực hiện:
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);
};
Như đã nêu, đây là một câu hỏi cũ, nhưng tôi thấy nó hữu ích vì vậy muốn thêm phản hồi với một giải pháp thay thế.
đối với một tháng, sử dụng JQuery v 1.7.2, tôi có javascript sau đây đang làm điều đó
$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']
});
Cảm ơn giải pháp của Ben Koehler.
Tuy nhiên, tôi đã gặp vấn đề với nhiều phiên bản của máy quét ngày, với một số trong số chúng cần thiết cho việc chọn ngày. Giải pháp của Ben Koehler (trong bản chỉnh sửa 3) hoạt động, nhưng ẩn lựa chọn ngày trong mọi trường hợp. Đây là một bản cập nhật giải quyết vấn đề này:
$('.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");
}
}
});
Sử dụng onSelect
gọi lại và xóa phần năm theo cách thủ công và đặt văn bản trong trường theo cách thủ công