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!

direndam
sumber
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"

ilyes kooli
sumber
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

Tapash
sumber
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();
    }

});
pleshy
sumber
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();
wintondeshong
sumber
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();
});
Tr1stan
sumber
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
});
Hady Shaltout
sumber
1

Inilah yang berhasil untuk saya (menggunakan jquery datepicker):

$('body').on('focus', '.datepicker', function() {
 $(this).removeClass('hasDatepicker').datepicker();
});
Vinicius Avelino Alcantara
sumber
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.

Chris
sumber
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', });
Nada N. Hantouli
sumber
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

c0x6a
sumber
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/

Mauricio Gracia Gutierrez
sumber
0
$( ".datepicker_recurring_start" ).each(function(){
    $(this).datepicker({
        dateFormat:"dd/mm/yy",
        yearRange: '2000:2012',
        changeYear: true,
        changeMonth: true
    });
});
Siya Qalistic
sumber