2010-10-18 28 views
20

Không có vấn đề gì tôi cố gắng, tôi không thể nhận được sự kiện beforeShow để kích hoạt ngày tháng của tôi. Đây là mã của tôi:trướcHiển thị sự kiện không kích hoạt trên jQueryUI Datepicker

$('#calendar').datepicker({ 
inline: true, 
dateFormat: 'mm,dd,yy', 
beforeShow: function(input, inst) { alert('before'); } 
}); 

Tôi đã thêm trước đâySau đó và bậtChọn sự kiện vào datepicker của tôi và chúng hoạt động chính xác. Có ai khác gặp rắc rối với điều này không?

+1

Bạn đang sử dụng phiên bản jquery và jqueryUI nào? – Leopd

Trả lời

0

Hơi phức tạp nhưng sử dụng phương thức setTimeout để khởi chạy chức năng hoạt động tốt cho tôi.

$('#calendar').datepicker({ 
inline: true, 
dateFormat: 'mm,dd,yy', 
beforeShow: function() { 
    setTimeout(function() { 
     alert('before'); 
    }, 10); 
} 
}); 
+0

Không đúng cách để tìm hiểu về người nghe. – lededje

4

Tôi tìm thấy bản sửa lỗi cho điều đó. Bạn phải thêm 3 dòng mã trong jquery.ui.datepicker.js (phiên bản đầy đủ)

gần dòng # 274, tìm thấy điều này this._updateAlternate(inst);

Ngay sau khi dòng này, đặt sau:

var beforeShow = $.datepicker._get(inst, 'beforeShow'); 
if(beforeShow) 
    beforeShow.apply(); 

Phiên bản từ jqueryui.com không có trướcHiển thị kích hoạt cho trình đếm ngày nội tuyến. Với mã này, trước khiShow được bật.

+0

Như đã đề cập trong câu trả lời, phương pháp này sẽ bật trướcHiển thị. Tuy nhiên, các tham số 'input' và' inst' không thể truy cập theo cách này như được định nghĩa tại http://jqueryui.com/demos/datepicker/#event-beforeShow –

5

Trên thực tế, đây là chính xác hơn một chút (và sau plugin/lớp mẫu):

var beforeShow = $.datepicker._get(inst, 'beforeShow'); 
extendRemove(inst.settings, (beforeShow ? beforeShow.apply(target, [target, inst]) : {})); 
+0

Bởi vì nó không rõ ràng trong câu trả lời, tôi muốn chỉ mã lệnh này nằm trong phương thức '_inlineDatepicker' ngay sau dòng' this._updateAlternate (inst) '. Trong jquery-ui-1.8 đầy đủ.23.js, điều này sẽ ở dòng 7156. –

23

Đây là giải pháp đội của tôi đã đưa ra vì vậy chúng tôi không cần phải nhớ để sửa đổi các tập tin jQuery mỗi khi có bản cập nhật. Chỉ cần thêm video này vào kịch bản của riêng bạn và bao gồm nó:

(function ($) { 
    $.extend($.datepicker, { 

     // Reference the orignal function so we can override it and call it later 
     _inlineDatepicker2: $.datepicker._inlineDatepicker, 

     // Override the _inlineDatepicker method 
     _inlineDatepicker: function (target, inst) { 

      // Call the original 
      this._inlineDatepicker2(target, inst); 

      var beforeShow = $.datepicker._get(inst, 'beforeShow'); 

      if (beforeShow) { 
       beforeShow.apply(target, [target, inst]); 
      } 
     } 
    }); 
}(jQuery)); 
+2

Đây là câu trả lời đúng. Làm việc hoàn hảo. Cảm ơn! – Matt

1

Tôi muốn sử dụng beforeShow để cập nhật ngày minumum trên một datepicker ngày kết thúc để phản ánh ngày thiết lập trong datepicker ngày bắt đầu. Tôi đã trả lại một số giải pháp được đăng ở đây và ở những nơi khác phức tạp. Tôi có thể thiếu một cái gì đó nhưng sau khá thẳng về phía trước mã làm việc cho tôi.

Điều này đặt lại trọng tâm về ngày bắt đầu nếu chưa thiết lập và cố gắng thực hiện để nhập ngày kết thúc. Nếu ngày bắt đầu được đặt, ngày đặt ngày tối thiểu cho kết thúc _Date một cách thích hợp.

$(function(){ 
    $("#start_Date").datepicker({ 
     changeMonth: true, 
     changeYear: true, 
     yearRange: "c-1:c+5", 
     dateFormat: "dd-mm-yy" 
    }); 
    $("#end_Date").datepicker({ 
     changeMonth: true, 
     changeYear: true, 
     yearRange: "c-1:c+5", 
     dateFormat: "dd-mm-yy", 
     beforeShow: end_Range 
    }); 

    function end_Range(){ 
     if ($("#start_Date").datepicker("getDate") == null){ 
      $("#start_Date").focus(); 
     } else { 
      // set minimum date range 
      $("#end_Date").datepicker("option", "minDate", new Date ($("#start_Date").datepicker("getDate"))); 
     }; 
    }; 
}); 

Với trường ngày:

<label>Date</label><input class="datepicker" id="start_Date" type="text"/> 
<label>Date</label><input class="datepicker" id="end_Date" type="text"/> 
0

Bạn đã gán datepicker() để yếu tố này trước đây chưa?

trướcHiển thị sự kiện đính kèm thành phần tử khi bạn gán datepicker() ở lần đầu tiên. Nếu bạn gán lại datepicker() cho cùng một phần tử thì nó sẽ không hoạt động đúng.

Cố gắng 'phá hủy' và gán lại datepicker(), điều này rất phù hợp với tôi.

$('#calendar').datepicker('destroy'); 

$('#calendar').datepicker({ 
    inline: true, 
    dateFormat: 'mm,dd,yy', 
    beforeShow: function(input, inst) { 
     alert('before'); 
    } 
}); 
Các vấn đề liên quan