2010-11-02 6 views
10

Tôi đã xem qua bài đăng này jQuery UI DatePicker to show month year only, điều này rất hữu ích đối với tôi để hack giao diện người dùng của bộ chọn giờ trong ngày cho phù hợp với tình huống của tôi.Bộ chọn ngày giờ JQuery - Chỉ cần chọn tháng và năm duy nhất

Nhưng khi tôi có một số bộ chọn ngày giờ trên cùng một biểu mẫu, điều này xảy ra. Các css display:none là nhằm mục đích 'ẩn' những ngày không được hiển thị. Nhưng nếu tôi có một số bộ chọn ngày giờ trên cùng một biểu mẫu nhưng chỉ một người tôi muốn làm cho một trong số đó là công cụ tìm kiếm hàng tháng, làm cách nào tôi có thể đạt được điều đó? Với css thw, nó làm cho tất cả các ngày trên tất cả các datetime UI lịch biến mất kể từ khi css sẽ thay đổi thuộc tính của .ui-datepicker-calendar. Mọi đề xuất đều được chào đón.

Trả lời

1

Tôi đã làm một cái gì đó tương tự như thế này, nhưng đã tạo ra một phiên bản riêng biệt của tập lệnh datepicker và gọi nó là tháng, có bộ chọn CSS riêng và tệp CSS. Điều này có nghĩa là bạn có thể sử dụng một trong hai hoặc cả hai trên cùng một trang.

+0

Xin chào Cảm ơn bạn đã trả lời loại, có thể giải thích thêm về điều đó, được rồi tôi sao chép một tệp .js khác gọi là monthpicker.js từ jquery.ui.datetimepicker.js, vì vậy bước tiếp theo sẽ giải thích cho bạn là "có riêng nó Bộ chọn CSS và tệp CSS "? – Darren

+0

@ Darren - Bạn cần phải chọn qua mã và xem cách tập lệnh chỉ định bộ chọn/id cho các mục mà nó tạo và thay đổi chúng để sử dụng 'monthpicker' thay vì 'datepicker' chẳng hạn. Sau đó, bạn cần sao chép tệp CSS và thực hiện các thay đổi phù hợp tại đó. – Paddy

+0

Vâng, chỉ cần tự hỏi liệu tôi có thể sử dụng thừa kế css để chỉ cần chọn lớp .ui-datepicker-lịch mà thuộc về datepicker duy nhất của tôi trong ? – Darren

9

Hiện tại, trình tạo ngày tháng chỉ tạo 1 phần tử trên mỗi trang mà tất cả các đầu vào 'datepicker' chia sẻ, do đó tại sao câu trả lời cho câu hỏi được liên kết không hoạt động. Sự kiện beforeShow không cho phép chỉnh sửa phần tử datepicker với .addClass() hoặc .css() (vì cấu trúc phần tử được làm mới từ tập lệnh datepicker khi nó hiển thị.)

Để giải quyết vấn đề này, tôi thấy trọng tâm sự kiện cho phần tử đầu vào xuất hiện để chạy mã sau khi trình hiển thị ngày tháng được hiển thị. Đó là một giải pháp đơn giản cho một vấn đề khó chịu.

Đây là mã của tôi:

<!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/jquery.js"></script> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script> 
    <link rel="stylesheet" type="text/css" media="screen" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"> 
<script type="text/javascript"> 
$(function() { 
    $('.month-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) { 
      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', 'monthNames')); 
       $(this).datepicker('option', 'defaultDate', new Date(year, month, 1)); 
       $(this).datepicker('setDate', new Date(year, month, 1)); 
      } 
     } 
    }); 
    $('.date-picker').datepicker(); 
    $('.month-picker').focus(function() { 
     $('.ui-datepicker-calendar').addClass('hideDates'); 
    }); 
}); 
</script> 
<style> 
.hideDates { 
    display: none; 
} 
</style> 
</head> 
<body> 
    <label for="startDate">Date:</label> 
    <input name="startDate" id="startDate" class="date-picker" /> 
    <label for="endMonth">End Month:</label> 
    <input name="endMonth" id="endMonth" class="month-picker" /> 
</body> 
</html> 
+0

Đường gọi datepicker với tham số trống là gì? nó làm gì? – Nap

+0

@Nassign - Có hai trình đặt ngày trên trang này. Cuộc gọi datepicker với tham số trống chỉ là tạo trình ghi ngày tháng thứ hai với chức năng mặc định. –

+0

Cảm ơn. Tôi tìm thấy một trang web thêm nút tùy chỉnh vào bảng điều khiển nút. Nhưng nút biến mất mỗi lần tháng được thay đổi và nút Now được thay đổi. Bất kì lời đề nghị nào? Đây là liên kết trang web: http://csharptechies.blogspot.com/2010/12/adding-custom-buttons-to-jquery.html – Nap

3

tôi đã sử dụng một phiên bản hơi khác nhau của mã mà Ben đăng. Thay vì dựa trên các sự kiện tập trung tôi đã thêm

inst.dpDiv.addClass('monthonly'); 

vào phương pháp beforeShow và

inst.dpDiv.removeClass('monthonly'); 

vào onClose. Điều này cho biết thêm và loại bỏ một lớp trên div chung được sử dụng bởi tất cả các widget datepicker. Sau đó, div lịch ngày có thể được nhắm mục tiêu trong css bằng cách sử dụng

.monthonly#ui-datepicker-div .ui-datepicker-calendar 
{ 
    display: none; 
} 
+0

Ước gì tôi đã đọc. Cách tiếp cận này ngăn cản việc định vị lịch bị sai khi xuất hiện phía trên đầu vào. (xem: http://stackoverflow.com/questions/5816749/jquery-ui-datepicker-month-and-year-only-css-positioning-problem) – benb

+0

Điều này thật tuyệt vời, cảm ơn! – MrYoshiji

2

Giải pháp trước đó sẽ không hoạt động với các định dạng khác nhau. Ngoài ra setDate sẽ không làm gì trong beforeShow. Cách thích hợp để làm điều đó sẽ là:

beforeShow: function(input, inst) { 
    var dateString = $(this).val(); 
    var options = new Object(); 
    if (dateString.length > 0) { 
     options.defaultDate = $.datepicker.parseDate("dd-" + $(this).datepicker("option", "dateFormat"), "01-" + dateString); 
    } 
    inst.dpDiv.addClass("ui-monthpicker"); 
    return options; 
}, 
onClose: function(dateText, inst) { 
    var month = inst.dpDiv.find(".ui-datepicker-month").val(); 
    var year = inst.dpDiv.find(".ui-datepicker-year").val(); 
    $(this).datepicker("setDate", new Date(year, month, 1)); 
    inst.dpDiv.removeClass("ui-monthpicker"); 
} 

Tôi đã sử dụng parseDate từ datepicker để xử lý các định dạng ngày khác nhau và ngày trả về từ trường làm tùy chọn mặc định.

CSS Yêu cầu:

#ui-datepicker-div.ui-monthpicker { 
    padding: 0.2em; 
} 
#ui-datepicker-div.ui-monthpicker .ui-datepicker-calendar { 
    display: none; 
} 
+0

Tôi đã thêm thời gian chờ khi xóa lớp ui-monthpicker, nếu không lịch sẽ "nhấp nháy" trước khi trình giữ ngày tháng bị ẩn. 'setTimeout (function() {inst.dpDiv.removeClass (" ui-monthpicker ");}, 200);' – user2444499

1

giải pháp của Ben hoạt động hoàn hảo, chỉ cần thực hiện một thay đổi nhỏ, tôi đã sử dụng onChangeMonthYear thay vì onClose:

onChangeMonthYear: function(year, month, inst) { 
    var date = new Date(year, month - 1, 1); 
    $(this).val($.datepicker.formatDate(format, date)); 
    $(this).datepicker('setDate', date); 
} 
0

code này đang làm việc một cách hoàn hảo với tôi:

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

<label for="month">Month: </label> 
<input type="text" id="month" name="month" class="monthPicker" /> 
2

Tôi có một giải pháp khác dựa trên những điều trên với một số cải tiến .Trong HTML của tôi, tôi giấu bảng chọn ngày bằng cách thêm này như tôi chỉ có một trên trang:

<style> 
    .ui-datepicker-calendar { 
     display: none; 
    } 
</style> 

sau đó tôi khởi datepicker của tôi như những người khác đã làm như vậy và thêm một chút mã vào sự kiện onChangeMonthYear:

$n(this).datepicker({ 
    defaultDate: 0, 
    changeMonth: true, 
    changeYear: true, 
    onChangeMonthYear: function(year, month, inst) { 
     $(this).datepicker('setDate', new Date(year, month - 1, 1)); 
    } 
}); 

Lưu ý:

tháng - 1

Nếu bạn không thêm điều này, bạn sẽ nhận được tràn ngăn xếp vì hàm này nhận được chỉ mục dựa trên 1 tháng nhưng setDate sử dụng tháng dựa trên 0 bình thường.