Я создал форму с выпадающим меню для выбора количества участников и кнопкой для добавления полей ввода. Однако возникла проблема: новые поля добавляются поверх уже существующих.
jQuery(function ($) {
$('#btnMore').click(function () {
var formElement, fields, newField;
var dropdown = document.getElementById("pax");
var selectedValue = dropdown.options[dropdown.selectedIndex].text;
formElement = $("#myemailform");
for (var i = 1; i < selectedValue; i++) {
fields = formElement.find("input[name^='ids']");
newField = $(fields[0]).clone();
newField.attr('name', 'ids' + (fields.length + 1));
newField.attr('placeholder', 'ID #' + (fields.length + 1));
newField.insertAfter(fields.last());
}
});
});
Суть проблемы:
Когда я выбираю число 10 и нажимаю кнопку, создается 10 полей. Затем, если я выбираю 14, я не хочу получить 10+14=24 текстовых поля. Мне нужно, чтобы было только 14 полей. Как это исправить? Понимаю, в чем проблема, но не знаю, как изменить код.
Проблема в том, что ты постоянно добавляешь к уже существующим полям. Лучше сделай по-другому - не удаляй старые поля, а просто пересчитай сколько нужно. Добавь проверку: var currentFields = formElement.find("input[name^='ids']").length; и в цикле используй for (var i = currentFields; i < selectedValue; i++). Если выбранное значение меньше текущих полей - удаляй лишние через slice(). Так будет работать в обе стороны.
Почему бы не очистить весь контейнер сначала? Например, $('#form_container').find('input[name^="ids"]').remove();, а затем заново создать все поля в цикле. Но нужно будет сохранить существующие значения. Кстати, зачем использовать выпадающий список, когда подойдет простой числовой ввод?
Вы создаёте форму, где количество полей ввода зависит от выбора в выпадающем меню. Проблема в том, что при изменении выбора в меню, новые поля добавляются к уже существующим, вместо замены их на новые. Вам нужно, чтобы при каждом изменении выбора в выпадающем списке, количество полей ввода соответствовало выбранному значению, а не суммировалось с предыдущим количеством.
Understanding the “Why” (The Root Cause):
Ваш текущий JavaScript код клонирует существующие поля и добавляет их. Он не удаляет старые поля перед добавлением новых. Поэтому при каждом клике кнопки “Добавить ID” количество полей увеличивается на выбранное значение.
Step-by-Step Guide:
Очистка существующих полей: Перед добавлением новых полей, необходимо удалить все существующие поля, кроме первого. Это предотвратит накопление полей при каждом изменении значения в выпадающем меню. Замените ваш код внутри функции $('#btnMore').click() следующим:
jQuery(function ($) {
$('#btnMore').click(function () {
var formElement, fields, newField;
var dropdown = document.getElementById("pax");
var selectedValue = parseInt(dropdown.value, 10); // Используем value, а не text
formElement = $("#myemailform");
// Удаляем все поля, кроме первого
formElement.find("input[name^='ids']").not(':first').remove();
// Создаём необходимое количество полей
for (var i = 1; i < selectedValue; i++) {
fields = formElement.find("input[name^='ids']");
newField = $(fields[0]).clone();
newField.attr('name', 'ids' + (fields.length + 1));
newField.attr('placeholder', 'ID #' + (fields.length + 1));
newField.insertAfter(fields.last());
}
});
});
Обратите внимание на изменения:
parseInt(dropdown.value, 10): Мы используем dropdown.value для получения числового значения, а не текстового (dropdown.text), и преобразуем его в целое число с помощью parseInt.
formElement.find("input[name^='ids']").not(':first').remove();: Эта строка удаляет все элементы input с именем, начинающимся с ids, за исключением первого.
Проверка на корректность ввода: Добавьте проверку на случай, если пользователь выберет значение меньше, чем количество уже существующих полей. В этом случае, нужно удалить лишние поля.
Common Pitfalls & What to Check Next:
Проверьте form-to-email.php: Убедитесь, что ваш скрипт обработки формы корректно обрабатывает динамически добавляемые поля. Возможно, потребуется изменить способ обработки данных на серверной стороне.
Используйте более семантичный HTML: Вместо использования input[name^='ids'] для поиска полей, лучше использовать уникальный контейнер (например, div) для группировки полей и упрощения выбора. Это улучшит читаемость кода и уменьшит вероятность ошибок.
Still running into issues? Share your (sanitized) config files, the exact command you ran, and any other relevant details. The community is here to help!