Проблема події jcuery Datepicker про зміну події


239

У мене є JS-код, в якому при зміні поля він викликає процедуру пошуку. Проблема полягає в тому, що я не можу знайти жодних подій jQuery, які запускаються, коли Datepicker оновить поле введення.

Чомусь подія зміни не викликається, коли Datepicker оновлює поле. Коли спливає календар, він змінює фокус, тому я також не можу його використовувати. Будь-які ідеї?


Я в кінцевому підсумку використовував stackoverflow.com/a/30132949/293792, оскільки це, як видається, безпосередньо відповіло на питання
twobob

Відповіді:


370

Ви можете використовувати onSelectподію датника .

$(".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

1
Я ходив кругом по колах, намагаючись перетворити це на роботу у всіх сценаріях, і це вдалося! Цінується!
Кріс Невілл

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 повертається невизначено, і, здається, це не одне з доступних властивостей.
BK

Я просто здійснив це взагалі без жодних питань. Працює як шарм.
DevSlick

це більше не працює, lastval вже не визначено
luke_mclachlan

4
@luke_mclachlan lastValоднак є ;-)
Олександр Дерк

lastValне існує на об'єкті вибору дати, принаймні в моєму тестуванні. Тож це рішення завжди спричинить зміни.
Микола

13

Ви шукаєте подію 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
});

Я використовую це за допомогою нокауту, я не міг змусити його викликати подію, коли користувач видалив або змінив дату вручну, не вибравши дату на вибральнику. Дуже корисний.
Тоні

Моя проблема з полями jQuery datepicker не точно така, як розміщена тут. Йдеться про зміну події зміни декілька разів. Я спробував кілька рішень, і це єдине, що насправді працює в моїй ситуації.
Patee Gutee

Я зробив більш-менш те саме, що це рішення, і я думаю, що це, безумовно, працює найкраще. Я опублікую те, що я зробив в окремій відповіді ...

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

14
Я думав, що це має працювати, але, на жаль, ні. Він спрацьовує лише при зміні поля за допомогою клавіатури , а не при виборі з вибору дати. Дратівливий.
Simon East

1
З документів інтерфейсу jQuery: "Цей віджет програмує значення свого елемента програмно, тому нативна подія зміни не може бути запущена, коли значення елемента змінюється."
Сем Кауффман

Найсмішніше, що я отримую протилежне тому - коли я змінюю введення вручну за допомогою клавіатури, жодна подія не спрацьовує. Але коли я змінюю значення поля через віджет, подія зміни запускається. Незвичайно.
Ренан

Це добре працює, коли я змінюю клавіатуру та коли змінюю віджет вибору дати.
Саммі

якось це дзвонить кілька разів.
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. Тому я пішов із наступним підходом, щоб запустити подію зміни через vanilla 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

Ви відправляєте подію зміни в події onSelect, що не зовсім бажаний ефект, оскільки вибір буде активовано кожного разу, коли дата натискається, але це не обов'язково означає, що дата була фактично змінена, тобто користувач, можливо, натиснув ту саму дату двічі.
Жак

@Jacques ви маєте рацію. я вважаю, ви могли б порівняти String dateText з цією.ізначення і запустити це лише у випадку, якщо вони різні.
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 запускається. Це дасть вам змогу контролювати кожну взаємодію; текстове поле користувача та вибральник дати.

Примітка. Іноді доводиться викликати процедуру у .change (), а не .onSelect (), оскільки onSelect може викликати різні взаємодії, яких ви не очікуєте.

Псевдокод:

$('#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
    });
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.