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
});
});
Почему средство выбора даты не отображается?
Ответы
Ответ 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.