jQuery Datepicker onchange 이벤트 문제


239

필드를 변경할 때 검색 루틴을 호출하는 JS 코드가 있습니다. 문제는 Datepicker가 입력 필드를 업데이트 할 때 발생하는 jQuery 이벤트를 찾을 수 없다는 것입니다.

어떤 이유로 Datepicker가 필드를 업데이트 할 때 변경 이벤트가 호출되지 않습니다. 캘린더가 팝업되면 포커스를 변경하여 사용할 수 없습니다. 어떤 아이디어?


내가 사용하는 결국 stackoverflow.com/a/30132949/293792을 이 직접 질문에 대답 등장 이후
twobob

답변:


370

datepicker 's onSelectevent를 사용할 수 있습니다 .

$(".date").datepicker({
    onSelect: function(dateText) {
        console.log("Selected date: " + dateText + "; input's current value: " + this.value);
    }
});

라이브 예 :

불행히도 onSelect날짜가 변경되지 않은 경우에도 날짜가 선택 될 때마다 발생합니다. 이것은 날짜 선택기의 디자인 결함입니다. onSelect변경 사항이 없더라도 항상 발생 하며 변경시 기본 입력에서 이벤트를 발생 시키지 않습니다 . (이 예제의 코드를 보면 변경 사항을 수신하고 있지만 변경되지는 않습니다.) 상황이 변경 될 때 입력에서 이벤트를 발생시켜야합니다 (일반적인 change이벤트 또는 아마도 날짜 선택기- 하나).


물론 원하는 경우 불에 change이벤트를 만들 수 있습니다 input.

$(".date").datepicker({
    onSelect: function() {
        $(this).change();
    }
});

그 의지 화재 change기본에 input어떤 핸들러는 jQuery를 통해 연결시켜 줬습니다. 그러나 다시, 그것은 항상 그것을 발사합니다. 실제 변경에서만 실행하려면 이전 값을 저장 data하고 비교해야합니다.

라이브 예 :


1
@ user760092 :이 답변을 게시 한 다음 나갔습니다. 문자 그대로 떠날 때 "알다시피 change처리기를 트리거 할 수 있습니다"라고 생각 하여 답변을 업데이트했습니다. :-)
TJ Crowder 2016 년

1
나는 모든 시나리오에서 작동하도록 원을 돌고 갔다. 매우 감사!
Chris Nevill

7
왜 세상에서 그들은 실제 사건을 만들지 않았습니까?
Jay K

1
"선택"용이며 "변경"용이 아닙니다. 날짜를 선택한 다음 다시 선택하면이 이벤트가 시작됩니다. 일부 개발자는 데이터가 "더러운"데이터인지 저장해야하는지 여부를 알기 위해 날짜가 초기 상태에서 변경된시기를 알고 싶어합니다. 이런 이유로, 나는 당신에게 이것을 내리고 있습니다.
AndroidDev

4
@ AndroidDev : 나는 그것을 분명히했습니다. ( 당신은 물론, 가질 수, 사이트의 목표는 것입니다 좋은 답변을 , 즉이 권장 달성하기 존중 편집.)이없는이 질문에 대해 답의 날짜 선택기의 설계 결함입니다. ( 해야 할 일은 날짜를 변경하는 경우에만 입력에 대해 일종의 변경 이벤트를 발생시키는 것이지만 그렇지 않은 경우)
TJ Crowder

67

TJ Crowder의 답변 ( https://stackoverflow.com/a/6471992/481154 )은 매우 훌륭하고 여전히 정확합니다. onSelect 함수 내에서 변경 이벤트를 트리거하는 것은 최대한 가깝습니다.

그러나 datepicker 객체 ( lastVal) 에는 값을 직접 저장하지 않고도 실제 변경에서만 변경 이벤트조건부로 트리거 할 수 있는 멋진 속성 이 있습니다 .

$('#dateInput').datepicker({
     onSelect: function(d,i){
          if(d !== i.lastVal){
              $(this).change();
          }
     }
});

그런 다음 일반과 같이 변경 이벤트를 처리하십시오.

$('#dateInput').change(function(){
     //Change code!
});

최근에 이것을 테스트 한 사람이 있습니까? 그것은 나를 위해 작동하지 않습니다. i.lastVal은 undefined를 반환하며 사용 가능한 속성 중 하나가 아닌 것으로 보입니다.
BK

방금 문제없이 이것을 구현했습니다. 매력처럼 작동합니다.
DevSlick

이 더 이상 작동하지 않습니다, lastval는 더 이상 정의되지 않은
luke_mclachlan

4
@luke_mclachlan lastVal그러나 ;-)입니다
알렉산더 Derck

lastVal적어도 내 테스트에서 datepicker 객체에 존재하지 않습니다. 따라서이 솔루션은 항상 변경을 트리거합니다.
Nicholas

13

datepicker 객체에서 onSelect 이벤트를 찾고 있습니다 .

$('.selector').datepicker({
   onSelect: function(dateText, inst) { ... }
});

11

날짜가 변경된 경우에만 이벤트를 트리거하는 솔루션이 필요했기 때문에 이것을 썼습니다.

간단한 해결책입니다. 대화 상자가 닫힐 때마다 데이터가 변경되었는지 테스트합니다. 그렇다면 맞춤 이벤트를 트리거하고 저장된 값을 재설정합니다.

$('.datetime').datepicker({
    onClose: function(dateText,datePickerInstance) {
        var oldValue = $(this).data('oldValue') || "";
        if (dateText !== oldValue) {
            $(this).data('oldValue',dateText);
            $(this).trigger('dateupdated');
        }
    }
});

이제 해당 사용자 정의 이벤트에 대한 핸들러를 연결할 수 있습니다.

$('body').on('dateupdated','.datetime', function(e) {
    // do something
});

나는 녹아웃과 함께 이것을 사용하고 있는데, 사용자가 피커에서 날짜를 선택하지 않고 날짜를 삭제하거나 수동으로 변경했을 때 이벤트를 트리거 할 수 없었습니다. 매우 도움이됩니다.
Tony

jQuery datepicker 필드에 대한 내 문제는 여기에 게시 된 것과 정확히 동일하지 않습니다. 변경 이벤트가 여러 번 발생하는 것입니다. 나는 여러 가지 해결책을 시도했으며 이것이 실제로 내 상황에서 작동하는 유일한 방법입니다.
Patee Gutee

나는이 솔루션과 거의 동일하게 작동했으며 확실히 가장 잘 작동한다고 생각합니다. 별도의 답변으로 내가 한 일을 게시 할 것입니다.

10
$('#inputfield').change(function() { 
    dosomething();
});

14
나는 이것이 효과가 있다고 생각했지만 불행히도 그렇지 않다. 날짜 선택기에서 선택할 때가 아니라 키보드를 사용하여 필드를 변경할 때만 트리거됩니다 . 성가신.
Simon East

1
jQuery UI 문서에서 : "이 위젯은 프로그래밍 방식으로 요소의 값을 조작하므로 요소의 값이 변경 될 때 기본 변경 이벤트가 시작되지 않을 수 있습니다."
Sam Kauffman

재미있는 점은 그 반대 가되고 있다는 것입니다. 키보드를 통해 수동으로 입력을 변경하면 아무런 이벤트도 발생하지 않습니다. 그러나 위젯을 통해 필드 값을 변경하면 change 이벤트가 시작됩니다. 이상한.
Renan

키보드로 변경하고 날짜 선택기 위젯으로 변경하면 올바르게 작동합니다.
Sammie

어떻게 든 이것은 여러 번 호출합니다.
NMathur

9

나는 bootstrap-datepicker를 사용하고 있으며 위의 해결책 중 어느 것도 나를 위해 일하지 않았다. 이 답변이 도움이되었습니다 ..

부트 스트랩 날짜 선택기 날짜 변경 이벤트가 수동으로 날짜를 편집하거나 날짜를 지울 때 발생하지 않습니다.

내가 적용한 내용은 다음과 같습니다.

 $('.date-picker').datepicker({
     endDate: new Date(),
     autoclose: true,
 }).on('changeDate', function(ev){
        //my work here
    });

이것이 다른 사람들을 도울 수 있기를 바랍니다.


4

jQueryUi 1.9에서는 추가 데이터 값과 beforeShow 및 onSelect 함수의 조합을 통해 작동하도록했습니다.

$( ".datepicker" ).datepicker({
    beforeShow: function( el ){
        // set the current value before showing the widget
        $(this).data('previous', $(el).val() );
    },

    onSelect: function( newText ){
        // compare the new value to the previous one
        if( $(this).data('previous') != newText ){
            // do whatever has to be done, e.g. log it to console
            console.log( 'changed to: ' + newText );
        }
    }
});

나를 위해 작동 :)


4

나는 이것이 오래된 질문이라는 것을 안다. 그러나 jQuery $ (this) .change () 이벤트를 올바르게 onSelect에서 실행할 수 없습니다. 그래서 바닐라 js를 통해 변경 이벤트를 발생시키기 위해 다음과 같은 접근 방식을 사용했습니다.

$('.date').datepicker({
     showOn: 'focus',
     dateFormat: 'mm-dd-yy',
     changeMonth: true,
     changeYear: true,
     onSelect: function() {
         var event;
         if(typeof window.Event == "function"){
             event = new Event('change');
             this.dispatchEvent(event);
         }   else {
             event = document.createEvent('HTMLEvents');
             event.initEvent('change', false, false);
             this.dispatchEvent(event);
         }
     }
});

이 스 니펫에 대한 오류 ''$ '이 (가) 정의되지 않았습니다 ". 어 오.
Michael12345 1

onSelect 이벤트에서 변경 이벤트를 발송합니다. 날짜를 클릭 할 때마다 select가 실행되기 때문에 원하는 효과는 아니지만 원하는 날짜가 실제로 변경되었음을 의미하지는 않습니다. 즉, 사용자가 동일한 날짜를 클릭했을 수 있습니다 두번.
Jacques

@Jacques 당신이 맞습니다. String dateText를 this.value와 비교하고 다른 경우에만 이것을 실행할 수 있다고 생각합니다.
tstrand66

@ Michael12345 무슨 말인지 알겠습니다. 더 이상 스 니펫이 없도록 수정했습니다. 내 사과
tstrand66

3

이 시도

$('#dateInput').datepicker({
 onSelect: function(){
       $(this).trigger('change');
      }
 }});

도움이 되었기를 바랍니다:)


3

시도 :

$('#idPicker').on('changeDate', function() {
    var date = $('#idPicker').datepicker('getFormattedDate');
});

1

수동은 말합니다 :

apply.daterangepicker: Triggered when the apply button is clicked, or when a predefined range is clicked

그래서:

$('#daterange').daterangepicker({
  locale: { cancelLabel: 'Clear' }  
});

$('#daterange').on('apply.daterangepicker', function() {
  alert('worked!');
});

나를 위해 작동합니다.


1

나의 해결책 :

var $dateInput = $('#dateInput');

$dateInput.datepicker({
    onSelect: function(f,d,i){
        if(d !== i.lastVal){
            $dateInput.trigger("change");
        }
    }
}).data('datepicker');

$dateInput.on("change", function () {
   //your code
});


0

아래의 DatePicker 선택된 값 변경 이벤트 코드

/* HTML Part */
<p>Date: <input type="text" id="datepicker"></p>

/* jQuery Part */
$("#datepicker").change(function() {
                selectedDate= $('#datepicker').datepicker({ dateFormat: 'yy-mm-dd' }).val();
                alert(selectedDate);        
            });

0

wdcalendar를 사용하는 경우 도움이 될 것입니다.

 $("#PatientBirthday").datepicker({ 
        picker: "<button class='calpick'></button>",
        onReturn:function(d){
          var today = new Date();
          var birthDate = d;
          var age = today.getFullYear() - birthDate.getFullYear();
          var m = today.getMonth() - birthDate.getMonth();
          if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
            age--;
          }

          $('#ageshow')[0].innerHTML="Age: "+age;
          $("#PatientBirthday").val((d.getMonth() + 1) + '/' + d.getDate() + '/' +  d.getFullYear());
        }
      }); 

onReturn 이벤트가 저에게 효과적입니다.

이 도움을 바랍니다


0

날짜 선택기 설정 방법에 문제가 있다고 생각합니다. altField를 사용하지 마십시오. 대신 onSelect가 실행될 때 값을 명시 적으로 설정하십시오. 이를 통해 각 상호 작용을 제어 할 수 있습니다. 사용자 텍스트 필드 및 날짜 선택기

참고 : 때로는 원하지 않는 다른 상호 작용에서 onSelect를 호출 할 수 있으므로 .onSelect ()가 아닌 .change ()에서 루틴을 호출해야하는 경우가 있습니다.

의사 코드 :

$('#date').datepicker({
    //altField: , //do not use
    onSelect: function(date){
        $('#date').val(date); //Set my textbox value
        //Do your search routine
    },
}).change(function(){
    //Or do it here...
});

$('#date').change(function(){
    var thisDate = $(this).val();
    if(isValidDate(thisDate)){
        $('#date').datepicker('setDate', thisDate); //Set my datepicker value
        //Do your search routine
    });
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.