Добавить дополнительную задачу поля

Я работаю над этой страницей, где у меня есть специальный JS/jQuery для добавления функции поиска по списку. При необходимости мне нужно иметь возможность «добавить» поле. У меня это работало до того, как я реализовал функцию поиска, но теперь это стало намного более запутанным. Я думаю, мне нужно использовать «ближайший» или «каждый» где-то здесь

$(function() {
  let count = 1;
  $("#addMore").click(function(e) {
    count++;
    var newChargeGroup = $("#chargeGroup1").clone().attr({
      id: "chargeGroup" + parseInt(count),
      name: "charge" + parseInt(count)
    });
    newChargeGroup.val("");
    $("#chargeGroups").append(newChargeGroup);
  });

  document.getElementById("addMore").addEventListener("click", function(event) {
    event.preventDefault()
  });

  $(document).ready(function() {
    $('#dropdownDisplay').on('click', function() {
      $('#dropdownContent').toggle();
    });

    $('#chargeSearch' + parseInt(count)).on('input', function() {
      let value = $(this).val().toLowerCase();
      $('#charge li').filter(function() {
        $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1);
      });
    });

    /* $('.charge').on('click', 'li', function (e) {
        //$(e.target).closest('span').text($(this).text());
        $('#dropdownDisplay > span').text($(this).text());
        $('#hiddenCharge').val($(this).text());
        $('#dropdownContent').hide();
      });*/
    $('.charge').on('click', 'li', function(e) {
      //$(e.target).closest('span').text($(this).text());
      $('#dropdownDisplay > span').text($(this).text());
      $('#hiddenCharge').val($(this).text());
      $('#dropdownContent').hide();
    });

    $(document).on('click', function(e) {
      if (!$(e.target).closest('.search-dropdown').length) {
        $('#dropdownContent').hide();
      } else {
        $("#chargeSearch1").focus();
      }

    });
  });

  // populate charges
  const chargeSelect = document.getElementById("charge");
  for (let state in myCharges) {
    let opt = document.createElement('li');
    opt.innerHTML = state;
    chargeSelect.appendChild(opt);
  }


});



const myCharges = {
  "this charge": "",
  "second charge": "",
  "third charge": "",
};
form .group {
  display: table;
  width: 100%;
}

form p.group label,
form div.group label {
  display: table-cell;
  width: 20%;
}

form p.group input,
form p.group select {
  /* display: table-cell; */
  width: 100%;
}

.terms-section {
  width: 100%;
  max-width: 400px;
  margin: 0 auto 1em;
}

#selectCharges>select {}

#addMore {
  margin: auto auto 1em;
  display: table-cell;
  text-align: center;
}

#termsCheck {
  cursor: pointer;
}

#scrollable {
  border: solid 1px;
  height: 100px;
  margin: 1em auto;
  padding: 10px;
  overflow-y: scroll;
}

.close {
  position: absolute;
  color: #fff;
  top: 0;
  right: 0;
  padding: 2px 10px;
  margin: 5px;
  background: rgba(0, 0, 0, 0.5);
  border-radius: 50px;
  cursor: pointer;
}

#popup {
  display: none;
  font-size: 1em;
  position: absolute;
  top: 0;
  width: 80%;
  max-width: 400px;
  height: 20em;
  padding: 20px;
  margin: auto;
  border: 1px solid;
  background: #eee;
  overflow-y: scroll;
  z-index: 101;
}

#mask {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #000;
  display: none;
  z-index: 100;
}

.search-dropdown {
  margin-bottom: 1em;
}

.dropdown-display {
  /* width: 75%; */
  /* display: table-cell; */
  padding: 0 6px 1px;
  border: 1px solid #bbb;
  cursor: pointer;
}

.dropdown-content {
  display: none;
}

.dropdown-content .search-input {
  display: table-cell;
  width: 100%;
  margin: 1em 5% 0 0;
}

.dropdown-content ul {
  list-style-type: none;
  padding: 0;
  margin: 0;
  display: inline-block;
  padding-top: 1em;
  width: 100%;
}

.dropdown-content ul li {
  padding: 0 10px;
  cursor: pointer;
  border: 1px solid #bbb;
  /* display: table-header-group; */
}

.dropdown-content ul li:not(:first-child) {
  border-top: 0;
}

.dropdown-content ul li:hover {
  background-color: #f1f1f1;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<form action = "google.com" method = "get" target = "_parent" name = "inmateInfo" id = "inmateInfo">
  <div id = "chargeGroups">
    <label>Charges: </label>
    <div class = "search-dropdown group" id = "chargeGroup1" name = "charge1">
      <div class = "dropdown-display" id = "dropdownDisplay">
        <span>Select Charge</span>
        <input name = "chargehide" type = "hidden" id = "hiddenCharge">
      </div>
      <div class = "dropdown-content" id = "dropdownContent">
        <input type = "text" placeholder = "Search..." id = "chargeSearch1" class = "search-input">
        <ul id = "charge" name = "charge">

        </ul>
      </div>
    </div>
  </div>

  <button id = "addMore">Add Charge</button>

</form>

Редактировать: Я хочу, чтобы кнопка «Добавить дополнительную плату» копировалась при нажатии. В нем идентификатор раскрывающегося списка/поля ввода будет одинаковым. В настоящее время после выбора платежа этот текст будет помещен в скрытое поле ввода. Для отправки данных мне нужно иметь несколько полей оплаты.

Идентификаторы должны быть уникальными

j08691 27.06.2024 23:31

@ j08691 Я знаю это. Я установил исходные значения для значенияwhat1 и собирался использовать attr.(...) для установки дополнительных через переменную count. Возможно, потребуется ночь поспать, прежде чем снова приступить к этому.

homsAU 27.06.2024 23:37

Вероятно, вы можете избежать всех этих идентификаторов и снова использовать делегирование событий, выбирая через класс - $('.charge').on('input', '.search-input', yourfunc) или аналогичный.

James 28.06.2024 01:00
Поведение ключевого слова "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
3
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы клонируете объекты, а затем пытаетесь использовать обработчики событий и для клонированного элемента, вы не можете сделать это напрямую. Используйте [концепцию делегирования событий]

Кроме того, id должен быть уникальным, поэтому вместо того, чтобы использовать его и пытаться изменить идентификаторы для клонированных элементов с использованием добавочного значения вообще не требуется, вы можете легко использовать концепцию класса.

Рабочий фрагмент (путем удаления повторяющихся идентификаторов и не использования id до тех пор, пока это не необходимо):

const myCharges = {
  "this charge": "",
  "second charge": "",
  "third charge": "",
};

let chargeHtml = '';

$.each(myCharges, function(i, n) {
  chargeHtml += '<li>' + i + '</li>';
});

$(function() {
  $('#addMore').click(function() {
    $('#chargeGroups').append($('.search-dropdown:first').clone());
  });

  $('#chargeGroups').on('click', '.dropdown-display', function() {
    $(this).next('.dropdown-content').toggle();
    $(this).next('.dropdown-content').find('ul').html(chargeHtml);

  });
  $('#chargeGroups').on('input','.search-input', function() {
    let value = $(this).val().toLowerCase();
    $(this).next('ul').find('li').filter(function() {
      $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1);
    });
  });

  $('#chargeGroups').on('click', 'ul > li', function(e) {
    $(this).closest('.search-dropdown').find('.dropdown-display > span').text($(this).text());
    $(this).closest('.search-dropdown').find('.dropdown-display > input[type=hidden]').val($(this).text());
    $(this).closest('.dropdown-content').hide();
  });

});
form .group {
  display: table;
  width: 100%;
}

form p.group label,
form div.group label {
  display: table-cell;
  width: 20%;
}

form p.group input,
form p.group select {
  /* display: table-cell; */
  width: 100%;
}

.terms-section {
  width: 100%;
  max-width: 400px;
  margin: 0 auto 1em;
}

#selectCharges>select {}

#addMore {
  margin: auto auto 1em;
  display: table-cell;
  text-align: center;
}

#termsCheck {
  cursor: pointer;
}

#scrollable {
  border: solid 1px;
  height: 100px;
  margin: 1em auto;
  padding: 10px;
  overflow-y: scroll;
}

.close {
  position: absolute;
  color: #fff;
  top: 0;
  right: 0;
  padding: 2px 10px;
  margin: 5px;
  background: rgba(0, 0, 0, 0.5);
  border-radius: 50px;
  cursor: pointer;
}

#popup {
  display: none;
  font-size: 1em;
  position: absolute;
  top: 0;
  width: 80%;
  max-width: 400px;
  height: 20em;
  padding: 20px;
  margin: auto;
  border: 1px solid;
  background: #eee;
  overflow-y: scroll;
  z-index: 101;
}

#mask {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #000;
  display: none;
  z-index: 100;
}

.search-dropdown {
  margin-bottom: 1em;
}

.dropdown-display {
  /* width: 75%; */
  /* display: table-cell; */
  padding: 0 6px 1px;
  border: 1px solid #bbb;
  cursor: pointer;
}

.dropdown-content {
  display: none;
}

.dropdown-content .search-input {
  display: table-cell;
  width: 100%;
  margin: 1em 5% 0 0;
}

.dropdown-content ul {
  list-style-type: none;
  padding: 0;
  margin: 0;
  display: inline-block;
  padding-top: 1em;
  width: 100%;
}

.dropdown-content ul li {
  padding: 0 10px;
  cursor: pointer;
  border: 1px solid #bbb;
  /* display: table-header-group; */
}

.dropdown-content ul li:not(:first-child) {
  border-top: 0;
}

.dropdown-content ul li:hover {
  background-color: #f1f1f1;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<form action = "google.com/" method = "get" target = "_parent" name = "inmateInfo" id = "inmateInfo">
  <div id = "chargeGroups">
    <label>Charges: </label>
    <div class = "search-dropdown group" name = "charge1">
      <div class = "dropdown-display">
        <span>Select Charge</span>
        <input name = "chargehide" type = "hidden">
      </div>
      <div class = "dropdown-content">
        <input type = "text" placeholder = "Search..." class = "search-input">
        <ul name = "charge">

        </ul>
      </div>
    </div>
  </div>

  <button id = "addMore">Add Charge</button>

</form>

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