Я работаю над проектом, в котором мне сложно добавить datetimepicker в динамически добавляемые строки таблицы. Я добавил datetimepicker в строки статической таблицы, и он отлично работает для них, но не работает для динамически добавленных строк таблицы.
Учебник, который я использую для datetimepicker
https://eonasdan.github.io/bootstrap-datetimepicker/
Мой код, который я пробовал: я клонирую скрытые строки.
Функция клонирования строки:
// Table Add Function
$('.table-add').click(function () {
var $clone = $TABLE.find('tr.hide').clone(true).removeClass('hide table-line');
hid = $TABLE.find('tr.hide').attr('id');
// //Assigning every table row a unique ID
var max=0;
$('table').find('tr').each(function(){
var id=parseInt($(this).attr('id'));
if (id>=max){
max = id;
}
});
//cloning row with new ID
$clone.attr('id', parseInt(max)+1);
//always assign new id to new table row, will be easy to recognize rows
$clone.find('input.myinput').attr('id', parseInt(max)+1);
$clone.find("[name='datepicker']").datetimepicker();
//$("[name='datepicker']").datetimepicker();
$hiddentr = $('table').find('tr.hide');
//add dynamic word picker to cloned rows dynamically
$clone.find('td:nth-last-child(4)').after('{% if obj.word_picker == "Y" %} <td><input id = "wordpicker" style = "border:none"; data-role = "tagsinput" class = "myinput" name = "unique_tag"/></td>{% endif %}');
$clone.appendTo( $('#'+hid).parent());
//submitting form after row clone
submitForm();
});
HTML скрытого тд:
<td>
<div style = "position: relative">
<input class = "form-control" type= "text" name = "datepicker" id= "datetime">
</div>
</td>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Беспорядочно, но просто запускайте datetimepisker каждый раз после добавления строки ...
$('#datetimepicker1').datetimepicker();
$('#datetimepicker2').datetimepicker();
так далее
Я смог инициализировать datetimepicker после того, как элемент был полностью сгенерирован в dom. рабочий код
function addTableRow() {
var tbodyElement = document.getElementById("tbody");
var trElement = document.createElement("tr");
trElement.id = "generatedTr";
for (var x=0; x<3; x++) {
var tdElement = document.createElement("td");
var textNode = document.createTextNode("Generated td: " + x);
tdElement.appendChild(textNode);
trElement.appendChild(tdElement);
}
var finalTdElement = document.createElement("td");
var inputElement = document.createElement("input");
inputElement.setAttribute("type", "text");
inputElement.id = "generatedInput";
finalTdElement.appendChild(inputElement);
trElement.appendChild(finalTdElement);
tbodyElement.appendChild(trElement);
$('#generatedInput').datetimepicker();
}
Если у вас есть несколько генерируемых элементов, которым требуется средство выбора даты и времени, я бы предложил создать класс для всех из них, а затем просто создать экземпляр плагина для этого класса, например.
$('.dateTimePickers').datetimepicker();
пренебрегая предыдущим комментарием, тестирование показало, что клонированные обработчики событий по-прежнему указывают на исходную таблицу. Не клонированное состояние. После того, как ваша таблица была клонирована, вам нужно будет настроить таргетинг на поле ввода и инициализировать datetimepicker, как только он попадет в dom. Это должно работать ПОСЛЕ завершения клонирования таблицы.
Я бы посоветовал не инициализировать datetimepicker каждый раз после каждого элемента. лучше использовать следующий код. Это будет работать как шарм.
Я провел много исследований для этого. Таким образом, рекомендуется использовать следующий код.
$('body').on('focus',".datetimepicker", function(){
$(this).datetimepicker();
});
попробуйте сначала добавить datepicker к скрытому элементу, когда вы клонируете свою таблицу, потому что вы используете .clone (true), он также должен захватывать обработчики событий, связанные после первой инициализации скрытого элемента. Я подозреваю, что ваши обработчики событий не являются обязательными, потому что на тот момент они не существуют в dom. (другие, пожалуйста, поправьте меня, если я ошибаюсь). Я быстро опробую это в своей кодовой ручке, клонировав всю панель, как только снова окажусь перед своим ПК.