jQuery Datepicker mengubah acara acara


239

Saya memiliki kode JS di mana ketika Anda mengubah bidang itu memanggil rutin pencarian. Masalahnya adalah bahwa saya tidak dapat menemukan peristiwa jQuery yang akan diaktifkan ketika Datepicker memperbarui bidang input.

Untuk beberapa alasan, acara perubahan tidak dipanggil saat Datepicker memperbarui bidang. Ketika kalender muncul itu mengubah fokus jadi saya tidak bisa menggunakannya juga. Ada ide?


Saya akhirnya menggunakan stackoverflow.com/a/30132949/293792 karena ini tampaknya langsung menjawab pertanyaan
twobob

Jawaban:


370

Anda dapat menggunakan datepicker ini onSelectacara .

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

Contoh langsung :

Sayangnya, onSelectmenyala kapan saja suatu tanggal dipilih, bahkan jika itu tidak berubah. Ini adalah cacat desain di datepicker: Selalu menyala onSelect(bahkan jika tidak ada yang berubah), dan tidak memecat setiap peristiwa pada input yang mendasari perubahan. (Jika Anda melihat dalam kode contoh itu, kami mendengarkan perubahan, tetapi mereka tidak dimunculkan.) Mungkin harus memunculkan suatu peristiwa pada input ketika hal-hal berubah (mungkin changeacara biasa , atau mungkin sebuah data-klik- spesifik).


Jika Anda suka, tentu saja, Anda dapat membuat changeacara di atas inputapi:

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

Itu akan menembak changepada yang mendasari inputuntuk setiap pawang yang terhubung melalui jQuery. Tapi sekali lagi, selalu memecatnya. Jika Anda hanya ingin melakukan perubahan nyata, Anda harus menyimpan nilai sebelumnya (mungkin melalui data) dan membandingkan.

Contoh langsung :


1
@ user760092: Saya memposting jawaban ini dan kemudian keluar, dan secara harfiah ketika saya pergi, saya berpikir "Anda tahu, Anda bisa memicu changehandler (s)" dan jadi saya telah memperbarui jawabannya dengan itu. :-)
TJ Crowder

1
Saya berputar-putar mencoba untuk mendapatkan ini bekerja di semua skenario dan ini telah berhasil! Sangat dihargai!
Chris Nevill

7
Mengapa di dunia ini mereka tidak membuat peristiwa yang sebenarnya?
Jay K

1
Ini untuk "memilih" dan BUKAN untuk "mengubah". Jika Anda memilih tanggal dan kemudian memilihnya kembali, acara ini dipecat. Beberapa pengembang ingin mengetahui kapan suatu tanggal telah berubah dari kondisi awal untuk mengetahui apakah data itu "kotor" dan perlu disimpan. Untuk alasan ini, saya menurunkan Anda dalam hal ini.
AndroidDev

4
@AndroidDev: Saya sudah mengklarifikasi itu. ( Anda bisa saja, tentu saja; tujuan dari situs ini adalah untuk memiliki jawaban yang baik ; pengeditan penuh hormat untuk mencapai yang didorong.) Ini adalah cacat desain di datepicker, bukan dalam jawabannya. (Apa yang harus dilakukan adalah menjalankan perubahan acara semacam pada input, jika dan hanya jika mengubah tanggal, tetapi tidak.)
TJ Crowder

67

Jawaban TJ Crowder ( https://stackoverflow.com/a/6471992/481154 ) sangat bagus dan masih tetap akurat. Memicu perubahan acara dalam fungsi onSelect sedekat yang akan Anda dapatkan.

Namun, ada properti bagus di objek datepicker ( lastVal) yang akan memungkinkan Anda untuk memicu peristiwa perubahan hanya pada perubahan aktual tanpa harus menyimpan nilai sendiri:

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

Maka hanya menangani perubahan acara seperti biasa:

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

Adakah yang mengujinya baru-baru ini? Itu tidak bekerja untuk saya. i.lastVal mengembalikan tidak terdefinisi dan tampaknya tidak menjadi salah satu properti yang tersedia.
BK

Saya hanya menerapkan ini tanpa masalah sama sekali. Bekerja seperti pesona.
DevSlick

ini tidak berfungsi lagi, lastval tidak lagi didefinisikan
luke_mclachlan

4
@luke_mclachlan lastValadalah ;-)
Alexander Derck

lastValtidak ada pada objek datepicker, setidaknya dalam pengujian saya. Jadi solusi ini akan selalu memicu perubahan.
Nicholas

13

Anda mencari acara onSelect di objek datepicker:

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

11

Saya menulis ini karena saya membutuhkan solusi untuk memicu suatu peristiwa hanya jika tanggalnya berubah.

Ini adalah solusi sederhana. Setiap kali kotak dialog ditutup, kami menguji untuk melihat apakah data telah berubah. Jika sudah, kami memicu acara khusus dan mereset nilai yang disimpan.

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

Sekarang kita dapat menghubungkan penangan untuk acara khusus itu ...

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

Saya menggunakan ini dengan sistem gugur, saya tidak bisa memicunya ketika pengguna menghapus atau mengubah tanggal secara manual tanpa memilih tanggal pada pemilih. Sangat membantu.
Tony

Masalah saya dengan bidang datepicker jQuery tidak persis sama dengan yang diposting di sini. Ini tentang acara perubahan yang ditembakkan beberapa kali. Saya mencoba beberapa solusi dan ini adalah satu-satunya yang benar-benar berfungsi dalam situasi saya.
Patee Gutee

Saya melakukan kurang lebih sama dengan solusi ini dan saya pikir itu pasti yang terbaik. Saya akan memposting apa yang saya lakukan dalam jawaban terpisah ...

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

14
Saya pikir ini harus berhasil, tetapi sayangnya tidak. Ini hanya dipicu ketika bidang diubah menggunakan keyboard , bukan saat memilih dari pemilih tanggal. Mengganggu.
Simon East

1
Dari dokumen jQuery UI: "Widget ini memanipulasi nilai elemennya secara terprogram, oleh karena itu peristiwa perubahan asli mungkin tidak dipecat ketika nilai elemen berubah."
Sam Kauffman

Yang lucu adalah saya mendapatkan kebalikan dari itu - ketika saya mengubah input dengan tangan melalui keyboard, tidak ada peristiwa yang dipicu. Tetapi ketika saya mengubah nilai bidang melalui widget, acara perubahan dipecat. Aneh.
Renan

Ini berfungsi dengan baik ketika saya mengganti dengan keyboard dan ketika saya mengganti dengan widget pemilih tanggal.
The Sammie

entah bagaimana ini memanggil beberapa kali.
NMathur


4

Pada jQueryUi 1.9 Saya berhasil membuatnya berfungsi melalui nilai data tambahan dan kombinasi fungsi beforeShow dan 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 );
        }
    }
});

Bekerja untuk saya :)


4

Saya tahu ini adalah pertanyaan lama. Tapi saya tidak bisa mendapatkan jquery $ (ini) .change () acara untuk mem-api dengan benar di Pilih. Jadi saya pergi dengan pendekatan berikut untuk memecat acara perubahan melalui 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);
         }
     }
});

Kesalahan "'$' tidak terdefinisi" untuk cuplikan ini. Uh oh.
Michael12345

Anda mengirim acara perubahan di acara onSelect yang tidak cukup efek yang diinginkan karena pilih akan memecat setiap kali tanggal diklik tetapi itu tidak berarti tanggal itu benar-benar berubah yaitu pengguna mungkin telah mengklik tanggal yang sama dua kali.
Jacques

@ Jacques kamu benar. Saya percaya Anda bisa membandingkan String dateText dengan this.value dan hanya menjalankan ini jika mereka berbeda.
tstrand66

@ Michael12345 saya mengerti maksud Anda. saya telah memodifikasinya sehingga tidak lagi berupa cuplikan. permintaan maaf saya.
tstrand66

3

Coba ini

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

Semoga ini membantu:)


3

Coba:

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

1

Manual mengatakan:

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

Begitu:

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

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

Bekerja untukku.


1

Keutuhan saya:

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 memilih nilai mengubah kode acara di bawah ini

/* 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

jika Anda menggunakan wdcalendar, ini akan membantu Anda

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

acara diReturn bekerja untuk saya

semoga ini membantu


0

Saya pikir masalah Anda mungkin terletak pada bagaimana pengaturan data Anda. Mengapa Anda tidak memutuskan input ... jangan gunakan altField. Alih-alih secara eksplisit mengatur nilai-nilai ketika onSelect menyala. Ini akan memberi Anda kendali atas setiap interaksi; bidang teks pengguna, dan datepicker.

Catatan: Terkadang Anda harus memanggil rutin pada .change () dan bukan .onSelect () karena onSelect dapat dipanggil pada interaksi berbeda yang tidak Anda harapkan.

Kode semu:

$('#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
    });
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.