установка datepicker () на динамически созданные элементы - JQuery / JQueryUI

95

У меня есть динамически созданные текстовые поля, и я хочу, чтобы каждый из них мог отображать календарь по клику. Код, который я использую:

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

Это будет работать только в первом текстовом поле, хотя все мои текстовые поля имеют класс datepicker_recurring_start.

Ваша помощь очень ценится!

  • 0
    Когда вы говорите «динамически создаваемый», вы имеете в виду код-за до загрузки страницы или javascript после загрузки страницы? Потому что, если элементы добавляются после загрузки страницы, вам нужно будет перепривязывать календарь каждый раз, когда добавляется новое текстовое поле.
  • 0
    Я загружаю его в коде с помощью PHP.
Показать ещё 3 комментария
Теги:
datepicker

9 ответов

219
Лучший ответ

вот трюк:

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

DEMO

Синтаксис $('...selector..').on('..event..', '...another-selector...', ...callback...);:
Добавьте слушателя в ...selector.. (body в нашем примере) для события ..event.. ( "focus" в нашем примере). Для всех потомков совпадающих узлов, которые соответствуют селектору ...another-selector... (.datepicker_recurring_start в нашем примере), примените обработчик событий ...callback... (встроенная функция в нашем примере)

Смотрите http://api.jquery.com/on/ и особенно раздел о делегированных событиях

  • 4
    Это решение, которое будет работать при любом динамическом добавлении. +1 тебе.
  • 5
    Хотя мне кажется странным, что вы хотите вызывать .datapicker() каждый раз, когда текстовое поле получает фокус - поэтому вы должны быть осторожны с этим подходом (если я правильно .datapicker() ). Тем не менее, я думаю, что вы будете в порядке с .datapicker() потому что он, вероятно, проверит, создан ли .datapicker() прежде чем пытаться воссоздать. С другим кодом у вас может не быть этой благодати. Кроме того, .on (представлен только в JQuery 1.7 - поэтому убедитесь, что вы используете правильную версию.
Показать ещё 18 комментариев
34

Для меня ниже jquery работал:

изменение "тела" на документ

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

Благодаря skafandri

Примечание. Убедитесь, что ваш идентификатор отличается для каждого поля.

  • 1
    Спасибо! Тело не работает для меня тоже.
  • 0
    Правильно - мне нужно использовать $ (document), а не $ ('body') - Вроде проблема с небольшими фрагментами кода. Я могу заставить пример работать без проблем, но как только я добавлю в скрипку кучу своих javascript-кодов, этот код больше не будет работать для меня. Благодаря обоим, хотя.
9

Отличный ответ skafandri +1

Это просто обновлено, чтобы проверить класс hasDatepicker.

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

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

});
  • 0
    Может ли это быть сокращено до $('body').on('focus',".datepicker:not(.hasDatepicker)", function(){$(this).datepicker();}); ?
7

Убедитесь, что ваш элемент с классом .date-picker НЕ имеет класса hasDatepicker. Если это произойдет, попытка повторной инициализации с помощью $myDatepicker.datepicker(); не удастся! Вместо этого вам нужно сделать...

$myDatepicker.removeClass('hasDatepicker').datepicker();
  • 0
    Абсолютно верно! Динамически загруженные элементы не стали для меня проблемой, поэтому это решение сработало.
5

Вам нужно запустить .datepicker(); снова после того, как вы динамически создали другие элементы текстового поля.

Я бы рекомендовал сделать это в методе обратного вызова для вызова, который добавляет элементы в DOM.

Итак, скажем, вы используете метод JQuery Load для извлечения элементов из источника и загрузки их в DOM, вы бы сделали что-то вроде этого:

$('#id_of_div_youre_dynamically_adding_to').load('ajax/get_textbox', function() {
  $(".datepicker_recurring_start" ).datepicker();
});
  • 1
    Это не всегда работает на практике из моего опыта. Лучше всего добавить уникальные идентификаторы к вашим элементам и использовать эти идентификаторы, чтобы ссылаться на них и применять указатель даты. Кажется, внутренне плагин использует эти селекторы.
1

Новый метод для динамических элементов MutationsObserver.. В следующем примере используется underscore.js для использования функции (_.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
});
0

Я изменил ответ @skafandri, чтобы избежать повторного применения конструктора datepicker ко всем входам с классом .datepicker_recurring_start.

Здесь HTML:

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

Здесь JS:

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

здесь рабочая демонстрация

0

вы можете добавить класс .datepicker в функцию javascript, чтобы иметь возможность динамически изменять тип ввода

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

Ни один из других решений не работал у меня. В моем приложении я добавляю элементы диапазона дат в документ, используя jquery, а затем применяю datepicker к ним. Поэтому ни один из решений для событий не работал по какой-то причине.

Вот что наконец-то сработало:

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

Надеюсь, это поможет кому-то, потому что это немного меня отбросило.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню