2010-04-05 30 views
33

Tôi có một biểu mẫu có nhiều yếu tố đầu vào. Một số trường ngày với một datepicker jQuery UI alraedy kèm theo:Kiểm tra xem phần tử đã có bộ đếm date jQuery chưa

$("#someElement").mask("9?9/99/9999").datepicker({showOn: 'button', buttonText:'Click here to show calendar', duration: 'fast', buttonImageOnly: true, buttonImage: /images/calicon.gif' }); 

Sau đó, tôi có một lệnh quan trọng liên kết với chức năng này:

function openCalendar() { 
    var selection = document.activeElement; 

    // { Need to test here if datepicker has already been initialized 
     $(selection).datepicker("show"); 
    // } 
} 

này hoạt động tuyệt vời cho các yếu tố đó đã có datepicker trên chúng. Tuy nhiên, bất kỳ trường nào khác sẽ ném một lỗi javascript. Tôi đang tự hỏi cách tốt nhất để kiểm tra xem liệu datepicker đã được khởi tạo trên trường đó chưa.

Trả lời

62

Chà không thể tin rằng tôi đã bỏ lỡ điều này. Dòng 108 của ui.datepicker.js:

/* Class name added to elements to indicate already configured with a date picker. */ 
markerClassName: 'hasDatepicker', 

Vì vậy, tôi chỉ cần kiểm tra hasClass('hasDatepicker'). Điều này có vẻ là cách đơn giản nhất. Hơn nữa, tuyên bố này kiểm tra xem máy ghi ngày giờ có được mở hay không (đối với bất kỳ ai quan tâm):

if ($("#ui-datepicker-div").is(":visible") && $("#ui-datepicker-div").html() != "") { 
    // datepicker is open. you need the second condition because it starts off as visible but empty 
} 
+7

Để kiểm tra xem tự động hoàn thành UI UI đã được khởi tạo chưa, tôi đã sử dụng lệnh này: '$ ('# myinput'). (': Data (autocomplete)')'. Tôi giả định điều này cũng làm việc cho datepicker. –

+0

Chỉ vì lớp đánh dấu tồn tại không phải lúc nào cũng có nghĩa là datepicker là trên nút. Trong Datatables khi nó chuyển sang xem thẻ datepicker được loại bỏ khỏi nút, nhưng lớp vẫn ở lại! Vì vậy, bạn cần phải thêm kiểm tra bổ sung như trên VÀ loại bỏ các lớp học nếu bạn cần phải rebind kể từ khi datepicker nội bộ sử dụng lớp như một proxy để ngăn chặn nhiều ràng buộc. – Jeff

1

Một giải pháp cơ bản là để thiết lập một thuộc tính tại thời điểm sử dụng tập tin đính kèm datepicker và sau đó kiểm tra cho rằng:

$("#someElement").mask("9?9/99/9999") 
.datepicker({showOn: 'button', buttonText:'Click here to show calendar', duration: 'fast', buttonImageOnly: true, buttonImage: /images/calicon.gif' }) 
.attr("data-calendar", "true"); 

Sau đó, bạn có thể làm:

if ($(selection).attr("data-calendar") == "true") 
    $(selection).datepicker("show"); 

Có cách trực tiếp hơn?

+0

Tôi thích phương pháp này nhưng tôi sẽ sử dụng 'addClass ("dữ liệu lịch")', sau đó sẽ cho phép bạn sử dụng một selector đơn giản như thế này : '$ (". dữ liệu lịch "). datepicker (" show ");'. – Travis

9

1) Nếu mã ném một lỗi khi cố gắng mở datepicker, bạn có thể đặt mã vào try..catch

2) Bạn có thể thiết lập một số dữ liệu vào lĩnh vực đầu vào khi khởi datepicker

$("#someElement").data("datepicker-initialized", true); 

3) Bạn có thể sử dụng dữ liệu được lưu trữ bởi datepicker Plugin

if($("#someElement").data("datepicker") != null){ 
    // datepicker initialized 
} 

hoặc

if($.data($('#someElement').get(0), 'datepicker')){ 
    // datepicker initialized 
} 

4) datepicker nội bộ sử dụng một hàm _getInst

if($.datepicker._getInst($('#someElement')[0]) != null){} 

phương pháp nào gần giống như ví dụ 3.

Không thể tìm thấy bất kỳ giải pháp tốt hơn.

+0

Xin cảm ơn! Điều đó đã giúp tôi rất nhiều. –

+0

'if ($ (" # someElement "). Dữ liệu (" datepicker ")! == null)' không chính xác, do 'data()' trả về 'undefined', không phải' null'. Một công cụ so sánh '! =' Ít nghiêm ngặt hơn mặc dù. –

+0

Tôi đã kiểm tra jQuery 1.5, bản phát hành mới nhất vào tháng 4 năm 2010, để đảm bảo rằng nó trả về 'undefined' hoặc' null'. Nó trả về 'undefined'. Tôi đã cập nhật câu trả lời của mình. Cảm ơn bạn đã bình luận. – Rafael

0

Tôi có một trường hợp khác. Tập lệnh của tôi đang sao chép các phần tử bảng cuối cùng bao gồm cả datepicker.

Jquery sẽ không hoạt động vì phần tử được sao chép đã đánh dấu là "hasDatepicker".

Để kích hoạt datepicker trong phần tử mới, hãy xóa tên lớp đó và khởi tạo nó, như thế này.

$("#yournewelementid").attr("class","your-class-name"); 
$("#yournewelementid").datepicker();  
-2

Đây là giải pháp của tôi :)

if(typeof jQuery.fn.datepicker !== "undefined") 
+0

Đây là kiểm tra nếu trong cửa sổ hiện tại là datepicker có sẵn, không phải nếu nó trên đầu vào. – Gh61

Các vấn đề liên quan