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?

zbestzeus
sumber
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 :

TJ Crowder
sumber
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!
});
theChrisKent
sumber
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) { ... }
});
locrizak
sumber
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
});
CodeDreamer68
sumber
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();
});
pengguna583576
sumber
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 :)

Seeeking
sumber
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);
         }
     }
});
tstrand66
sumber
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:)

pelacak mike
sumber
3

Coba:

$('#idPicker').on('changeDate', function() {
    var date = $('#idPicker').datepicker('getFormattedDate');
});
GiorgosBarkos
sumber
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.

Sam
sumber
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
});
Andriy Petrusha
sumber
1

Solusi saya adalah:

events: {
    'apply.daterangepicker #selector': 'function'
}
Daniel Ortegón
sumber
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);        
            });
Hemang Rami
sumber
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

mavirroco
sumber
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
    });
});
Jeremy
sumber