Проблема с добавлением datetimepicker в динамически добавляемые строки таблицы

Я работаю над проектом, в котором мне сложно добавить 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> 
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
399
3

Ответы 3

Беспорядочно, но просто запускайте 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();

попробуйте сначала добавить datepicker к скрытому элементу, когда вы клонируете свою таблицу, потому что вы используете .clone (true), он также должен захватывать обработчики событий, связанные после первой инициализации скрытого элемента. Я подозреваю, что ваши обработчики событий не являются обязательными, потому что на тот момент они не существуют в dom. (другие, пожалуйста, поправьте меня, если я ошибаюсь). Я быстро опробую это в своей кодовой ручке, клонировав всю панель, как только снова окажусь перед своим ПК.

Nebri 09.07.2018 23:56

пренебрегая предыдущим комментарием, тестирование показало, что клонированные обработчики событий по-прежнему указывают на исходную таблицу. Не клонированное состояние. После того, как ваша таблица была клонирована, вам нужно будет настроить таргетинг на поле ввода и инициализировать datetimepicker, как только он попадет в dom. Это должно работать ПОСЛЕ завершения клонирования таблицы.

Nebri 10.07.2018 00:12

Я бы посоветовал не инициализировать datetimepicker каждый раз после каждого элемента. лучше использовать следующий код. Это будет работать как шарм.

Я провел много исследований для этого. Таким образом, рекомендуется использовать следующий код.

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

Другие вопросы по теме