menempatkan datepicker () pada elemen yang dibuat secara dinamis - JQuery / JQueryUI


115

Saya telah membuat kotak teks secara dinamis, dan saya ingin masing-masing dapat menampilkan kalender saat diklik. Kode yang saya gunakan adalah:

$(".datepicker_recurring_start" ).datepicker();

Yang hanya akan berfungsi pada kotak teks pertama, meskipun semua kotak teks saya memiliki kelas yang disebut datepicker_recurring_start.

Bantuan Anda sangat dihargai!


Ketika Anda mengatakan "dibuat secara dinamis", apakah yang Anda maksud dengan kode di belakang sebelum halaman dimuat atau dengan javascript setelah halaman dimuat? Karena jika elemen ditambahkan setelah pemuatan halaman, Anda harus memasang kembali kalender setiap kali kotak teks baru ditambahkan.
DangerMonkey

Saya memuatnya di belakang kode dengan PHP.
merendam

Saya pikir Anda mungkin menjadi bingung, tetapi kemudian sulit untuk mengatakan dengan info yang Anda berikan. Jadi hanya untuk mengkonfirmasi, bisakah Anda mengkonfirmasi apa yang Anda maksud dengan 'kotak teks yang dibuat secara dinamis'?
Tr1stan

Jika saya memuat 'halaman satu', php melihat ke db untuk melihat berapa banyak kotak teks tanggal di 'halaman satu' dan menampilkannya. Jadi ketika 'halaman pertama' dimuat, akan ada 4 kotak teks yang perlu memuat datepicker (). 'halaman dua' memiliki 7 kotak teks yang perlu memuat fungsi datepicker ().
merendam

Jika Anda memiliki masalah dengan pemilih data yang tidak berfungsi setelah panggilan pertama, lihat jawaban ini: stackoverflow.com/a/16283547/1329910 Masalah Anda mungkin ada hubungannya dengan datepicker yang menambahkan kelasnya sendiri: hasDatepicker
Vlad

Jawaban:


270

inilah triknya:

$('body').on('focus',".datepicker_recurring_start", function(){
    $(this).datepicker();
});​

DEMO

The $('...selector..').on('..event..', '...another-selector...', ...callback...);berarti sintaks:
Tambah pendengar ke ...selector..(yang bodydalam contoh kita) untuk acara ..event..( 'fokus' dalam contoh kita). Untuk semua turunan dari node yang cocok yang cocok dengan selektor ...another-selector...( .datepicker_recurring_startdalam contoh kita), terapkan event handler ...callback...(fungsi inline dalam contoh kita)

Lihat http://api.jquery.com/on/ dan terutama bagian tentang "acara yang didelegasikan"


4
Ini adalah solusi yang akan bekerja dalam segala jenis penambahan dinamis. +1 untuk Anda.
DangerMonkey

5
Meskipun tampak aneh bagi saya bahwa Anda ingin menelepon .datapicker()setiap kali kotak teks mendapatkan fokus - jadi Anda ingin berhati-hati dengan pendekatan ini (dengan asumsi saya membaca ini dengan benar). Namun, saya pikir Anda akan baik-baik saja dengan .datapicker()karena mungkin akan memeriksa apakah datepicker dibuat sebelum mencoba membuat ulang. Dengan kode lain Anda mungkin tidak memiliki rahmat ini. Selain itu, .on (hanya diperkenalkan di JQuery 1.7 - jadi pastikan Anda menggunakan versi yang benar.
Tr1stan

3
datepicker cukup pintar untuk memeriksa apakah sudah dibuat atau belum (semua komponen jQueryUI) jika versi jQuery di bawah 1.7 Anda cukup menggunakan live
ilyes kooli

7
Anda mungkin ingin menambahkan filter:not(.hasDatepicker)
Salman A

1
Waspadai penggunaan jQuery.clone () dalam area yang menyertakan datepicker. Jika Anda melakukannya, tambahkan ini untuk menghapus kelas hasDatepicker DAN datepicker id ditambahkan ke masukan Anda: .... find ('input.hasDatepicker'). RemoveClass ('hasDatepicker'). RemoveAttr ('id');
yahermann

44

Bagi saya di bawah ini jquery bekerja:

mengubah "body" menjadi document

$(document).on('focus',".datepicker_recurring_start", function(){
    $(this).datepicker();
});

Terima kasih untuk skafandri

Catatan: pastikan id Anda berbeda untuk setiap bidang


Benar - bagi saya, saya harus menggunakan $ (dokumen) dan bukan $ ('body') - Urutkan masalah dengan potongan kecil kode. Saya bisa mendapatkan contoh untuk bekerja tidak masalah, tetapi dan segera setelah saya menambahkan sekumpulan javascript saya ke dalam biola, kode ini tidak lagi berfungsi untuk saya. Terima kasih untuk keduanya.
Tom Stickel

16

Jawaban luar biasa oleh skafandri +1

Ini baru saja diperbarui untuk memeriksa kelas hasDatepicker.

$('body').on('focus',".datepicker", function(){

    if( $(this).hasClass('hasDatepicker') === false )  {
        $(this).datepicker();
    }

});

1
Mungkinkah itu disingkat menjadi $('body').on('focus',".datepicker:not(.hasDatepicker)", function(){$(this).datepicker();});?
Luke Stevenson

11

Pastikan elemen Anda dengan .date-pickerkelas tersebut TIDAK memiliki hasDatepickerkelas. Jika ya, bahkan upaya untuk menginisialisasi ulang dengan $myDatepicker.datepicker();akan gagal! Sebaliknya Anda perlu melakukan ...

$myDatepicker.removeClass('hasDatepicker').datepicker();

Benar sekali! Elemen yang dimuat secara dinamis tidak menjadi masalah bagi saya, jadi solusi ini berhasil.
Sterling Beason

6

Anda perlu menjalankan .datepicker();lagi setelah Anda secara dinamis membuat elemen kotak teks lainnya.

Saya akan merekomendasikan melakukannya dalam metode panggilan balik dari panggilan yang menambahkan elemen ke DOM.

Jadi katakanlah Anda menggunakan metode JQuery Load untuk menarik elemen dari sumber dan memuatnya ke DOM, Anda akan melakukan sesuatu seperti ini:

$('#id_of_div_youre_dynamically_adding_to').load('ajax/get_textbox', function() {
  $(".datepicker_recurring_start" ).datepicker();
});

1
Ini tidak selalu berhasil dalam praktik dari pengalaman saya. Kasus terbaik adalah menambahkan ID unik ke elemen Anda dan menggunakan ID tersebut untuk mereferensikannya dan menerapkan datepicker. Sepertinya secara internal plugin menggunakan selektor tersebut.
Wes Johnson

1

Metode baru untuk elemen dinamis adalah MutationsObserver .. Contoh berikut menggunakan underscore.js untuk menggunakan fungsi (_.each).

MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;    

var observerjQueryPlugins = new MutationObserver(function (repeaterWrapper) {

    _.each(repeaterWrapper, function (repeaterItem, index) {

        var jq_nodes = $(repeaterItem.addedNodes);

        jq_nodes.each(function () {

            // Date Picker
            $(this).parents('.current-repeateritem-container').find('.element-datepicker').datepicker({
                dateFormat: "dd MM, yy",
                showAnim: "slideDown",
                changeMonth: true,
                numberOfMonths: 1
            });

        });

    });

});

observerjQueryPlugins.observe(document, {
    childList: true,
    subtree: true,
    attributes: false,
    characterData: false
});

1

Inilah yang berhasil untuk saya (menggunakan jquery datepicker):

$('body').on('focus', '.datepicker', function() {
 $(this).removeClass('hasDatepicker').datepicker();
});

0

Tidak ada solusi lain yang berhasil untuk saya. Di aplikasi saya, saya menambahkan elemen rentang tanggal ke dokumen menggunakan jquery dan kemudian menerapkan datepicker padanya. Jadi tidak ada solusi acara yang berfungsi karena alasan tertentu.

Inilah yang akhirnya berhasil:

$(document).on('changeDate',"#elementid", function(){
    alert('event fired');
});

Semoga ini bisa membantu seseorang karena ini membuat saya sedikit mundur.


0

Anda dapat menambahkan kelas .datepicker dalam fungsi javascript, agar dapat secara dinamis mengubah jenis masukan

 $("#ddlDefault").addClass("datepicker");
 $(".datepicker").datetimepicker({ timepicker: false, format: 'd/m/Y', });

0

Saya telah mengubah jawaban @skafandri untuk menghindari penerapan ulang datepickerkonstruktor ke semua input dengan .datepicker_recurring_startkelas.

Berikut HTML-nya:

<div id="content"></div>
<button id="cmd">add a datepicker</button>

Inilah JS:

$('#cmd').click(function() {
  var new_datepicker = $('<input type="text">').datepicker();
  $('#content').append('<br>a datepicker ').append(new_datepicker);
});

inilah demo yang berfungsi


0

Inilah yang berhasil bagi saya di JQuery 1.3 dan ditampilkan pada klik / fokus pertama

function vincularDatePickers() {
    $('.mostrar_calendario').live('click', function () {
        $(this).datepicker({ showButtonPanel: true, changeMonth: true, changeYear: true, showOn: 'focus' }).focus();
    });
}

ini membutuhkan masukan Anda memiliki kelas 'mostrar_calendario'

Live adalah untuk JQuery 1.3+ untuk versi yang lebih baru, Anda perlu menyesuaikannya dengan "on"

Lihat lebih lanjut tentang perbedaannya di sini http://api.jquery.com/live/


0
$( ".datepicker_recurring_start" ).each(function(){
    $(this).datepicker({
        dateFormat:"dd/mm/yy",
        yearRange: '2000:2012',
        changeYear: true,
        changeMonth: true
    });
});
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.