Подтвердить что ты не робот

Jquery datepicker не работает с динамически созданным html

Я динамически создаю пару div с внутренним контролем. Два из этих элементов управления должны быть сборщиками даты. Но по какой-то причине они не отображаются (отображается только входной текст)  Это работает, если я создаю статический HTML, но не когда я использую динамический.

Это код, который я использую для генерации HTML (я вижу div)

var ShowContainerDiv = document.createElement('DIV');

var btnShowDiv = document.createElement('DIV');
btnShowDiv.id = 'btnShowDiv ';
btnShowDiv.title = 'Change';
btnShowDiv.index = 120;

var lblShow = document.createElement('label')
lblShow.htmlFor = "btnShowDiv";
lblShow.appendChild(document.createTextNode('Show'));
btnShowDiv.appendChild(lblShow );
btnShowDiv.onclick = function () {
    dropdown.style.visibility = "visible";
};

var dropdown = document.createElement('DIV');
dropdown.style.backgroundColor = 'white';
dropdown.style.borderStyle = 'solid';
dropdown.style.borderWidth = '2px';
dropdown.style.cursor = 'pointer';
dropdown.style.textAlign = 'left';
dropdown.style.width = '150px';

var chkRed = document.createElement("input");
chkRed.type = "checkbox";
chkRed.id = "chkRed";
chkRed.value = "Red";
chkRed.checked = false;
var lblRed = document.createElement('label')
lblRed.htmlFor = "chkRed";
lblRed.style.color = "#F00";
lblRed.appendChild(document.createTextNode('Red'));

var chkYellow = document.createElement("input");
chkYellow.type = "checkbox";
chkYellow.id = "chkYellow";
chkYellow.value = "Yellow";
chkYellow.checked = false;
var lblYellow = document.createElement('label')
lblYellow.htmlFor = "chkYellow";
lblYellow.style.color = "#FF0";
lblYellow.appendChild(document.createTextNode('Yellow'));

var chkGreen = document.createElement("input");
chkGreen.type = "checkbox";
chkGreen.id = "chkGreen";
chkGreen.value = "Green";
chkGreen.checked = false;
var lblGreen = document.createElement('label')
lblGreen.htmlFor = "chkGreen";
lblGreen.style.color = "#0F0";
lblGreen.appendChild(document.createTextNode('Green'));

var dateFrom = document.createElement("input");
dateFrom.id = "txtDateFrom";
dateFrom.type = "text";
dateFrom.className = "datepicker";
dateFrom.style.width = "70px";
dateFrom.readonly = "readonly";
var lblDateFrom = document.createElement('label')
lblDateFrom.htmlFor = "txtDateFrom";
lblDateFrom.appendChild(document.createTextNode('From'));

var dateTo = document.createElement("input");
dateTo.id = "txtDateTo";
dateTo.type = "text";
dateTo.className = "datepicker";
dateTo.style.width = "70px";
dateTo.readonly = "readonly";
var lblDateTo = document.createElement('label')
lblDateTo.htmlFor = "txtDateTo";
lblDateTo.appendChild(document.createTextNode('To'));

var btnDone = document.createElement("input");
btnDone.type = "button";
btnDone.name = "btnDone";
btnDone.value = "Done";
btnDone.onclick = function () {
    dropdown.style.visibility = "hidden";
};

dropdown.appendChild(chkRed);
dropdown.appendChild(lblRed);
dropdown.appendChild(document.createElement("BR"));
dropdown.appendChild(chkYellow);
dropdown.appendChild(lblYellow);
dropdown.appendChild(document.createElement("BR"));
dropdown.appendChild(chkGreen);
dropdown.appendChild(lblGreen);
dropdown.appendChild(document.createElement("BR"));
dropdown.appendChild(dateFrom);
dropdown.appendChild(document.createElement("BR"));
dropdown.appendChild(dateTo);
dropdown.appendChild(document.createElement("BR"));
dropdown.appendChild(btnDone);

ShowContainerDiv.appendChild(btnShowDiv);
ShowContainerDiv.appendChild(dropdown);

g.event.addDomListener(btnShowDiv, 'click', function () {
    dropdown.visible = true;
    dropdown.style.visibility = "visible";
});

g.event.addDomListener(btnDone, 'click', function () {
    dropdown.visible = false;
    dropdown.style.visibility = "hidden";
});

map.controls[g.ControlPosition.TOP_RIGHT].push(ShowContainerDiv);

Затем в файле .js у меня есть это (я проверил, и я включаю файл)

$(document).ready(function () {
    $(".datepicker").datepicker({
        dateFormat: 'yy/m/d',
        firstDay: 1,
        changeMonth: true,
        changeYear: true,
        showOn: 'both',
        autosize: true,
        buttonText: "Select date",
        buttonImage: '../Content/images/calendar.png',
        buttonImageOnly: true
    });
});

Почему средство выбора даты не отображается?

4b9b3361

Ответ 1

Когда вы пишете

$(document).ready(function () {
    $(".datepicker").datepicker({...});
});

Этот фрагмент запускается сразу после загрузки страницы. Поэтому ваших динамических датпикеров еще нет. Вам нужно вызвать $(aSuitableSelector).datepicker(...) для каждого вновь вставленного элемента. Во-первых, используйте var для хранения ваших опций:

var datePickerOptions = {
    dateFormat: 'yy/m/d',
    firstDay: 1,
    changeMonth: true,
    changeYear: true,
    // ...
}

Это позволяет вам писать

 $(document).ready(function () {
    $(".datepicker").datepicker(datePickerOptions);
 });

и написать

 // right after appending dateFrom to the document ...
 $(dateFrom).datepicker(datePickerOptions);

 //...

 // right after appending dateTo ...
 $(dateTo).datepicker(datePickerOptions);

Вы также можете использовать возможность JQuery для прослушивать изменения DOM, чтобы избежать необходимости применять магию JS к вновь вставленным элементам - но я не думаю, что это стоит он.

Ответ 2

Я нашел самый простой способ добавить средство выбора даты для динамически добавляемого поля ввода:

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

Ответ 3

Самый простой способ решить эту проблему - использовать плагин livequery:

http://docs.jquery.com/Plugins/livequery

Вместо того, чтобы применять datepickers ко всем объектам определенного класса, вы указываете LiveQuery применить его к этим объектам. LiveQuery, в свою очередь, будет продолжать применять datepicker, даже когда ваш DOM будет изменен позже.

Я не видел, чтобы производительность снижалась при использовании usnig, а изменения кода действительно минимальны (вам нужно добавить плагин на страницу и изменить только одну строку кода).

Вы бы использовали его так:

$(".datepicker").livequery(
        function(){ 
            // This function is called when a new object is found. 
            $(this).datepicker({ ...}});
        }, 
        function() { 
            // This function is called when an existing item is being removed. I don't think you need this one so just leave it as an empty function.
        }
); 

С этого момента каждый раз, когда вы добавляете объект с классом datepicker, плагин datepicker будет автоматически применен к нему.

Ответ 4

Вы можете просто использовать это.

$('body').on('focus',".date-picker", function(){
  $(this).datepicker();
});

Ответ 5

Код, который привязывает datepickers, лучше всего выполнить сразу после того, как ваш html будет динамически создан. Если вы хотите сохранить код для инициализации datepicker в отдельном файле, я бы рекомендовал следующий подход: После того, как вы закончите генерировать свой html (я полагаю, он создан на готовом документе), используйте

$(document).trigger("customHtmlGenerated");

И в файле datepicker вместо $(document).ready(function(){...}) используйте $(document).bind("customHtmlGenerated", function(){...});

Ответ 6

Я положил

$( "#InstallDate" ).datepicker({
  showOn: "button",
    minDate: 0, // no past dates
  buttonImage: "../images/Date.png",
  buttonImageOnly: true,
  buttonText: "Select date",
  dateFormat: 'yy-mm-dd',
}); 

в файл DatePicker.js script, а затем добавили следующую строку в конце моей сгенерированной формы Ajax Html

<script type='text/javascript' src='/inc/DatePicker.js'></script> 

Ответ 7

$( ".datepicker" ).datepicker({inline: true,dateFormat: "dd-mm-yy"});

Ответ 8

Пожалуйста, добавьте следующий код после добавления элемента.

$(".datepicker").datepicker({
        dateFormat: 'yy/m/d',
        firstDay: 1,
        changeMonth: true,
        changeYear: true,
        showOn: 'both',
        autosize: true,
        buttonText: "Select date",
        buttonImage: '../Content/images/calendar.png',
        buttonImageOnly: true
    });

Ответ 9

Я решил для динамически созданного элемента ввода с этим: -

$(document).ready(function () {
    $(selector).removeClass('hasDatepicker').datepicker();
});

Ответ 10

Код jQuery выполняется, когда документ готов: это означает, что начальная разметка вашей страницы будет готова, а не после того, как ваши файлы javascript будут работать.

Я предполагаю, что ваш код для инициализации datepickers запускает до вашего script, создавая элементы, поэтому ничего не происходит.


Попробуйте выполнить код jquery при загрузке страницы с помощью . load() вместо .ready(). Событие загрузки запускается при загрузке всех активов (js, image...).

$(window).load(function () {
    $(".datepicker").datepicker({
        ...
    });
});

Вы также можете просто использовать способ javascript. Скрипты выполняются в том порядке, в котором они выполняются на странице. Таким образом, вы могли:

  • переместите свои скрипты прямо перед тегом закрывающего тега `` `
  • убедитесь, что ваш первый script (создающий элементы) предшествует коду datepicker
  • удалите обработчик .ready() для выбора даты. Когда вы поместите свой script в конце, они неявно запускаются, когда DOM готов...

Ответ 11

Вероятно, это вопрос, в каком порядке запускается javascript. Попробуйте поставить

$(".datepicker").datepicker({
    dateFormat: 'yy/m/d',
    firstDay: 1,
    changeMonth: true,
    changeYear: true,
    showOn: 'both',
    autosize: true,
    buttonText: "Select date",
    buttonImage: '../Content/images/calendar.png',
    buttonImageOnly: true
});

После вашего javascript, который создает html.