Как лучше добавить скрытый input в форму через js?

Ссылка скопирована
1 ответ

Сейчас ситуация такая: пож-та добавить скрытый input c параметром data-otkuda в форму через js. Есть html копки, по клику на неё через js формируется форма. Так вот в эту форму и нужно добавить скрытый input. Не очень силен в js, поэтому прошу помощи.

<a href="javascript:void(0)" class="btn btn-turq d-md-inline-block d-none popUpForm" data-title="Закажите звонок" data-fields="name,phone" data-bform="И наш менеджер перезвонит Вам в ближайшее время" data-button="Заказать звонок" data-otkuda="Заявка на заказ обратного звонка">Заказать звонок</a>

И js

$(document).on('submit', '.normalForm', function (e) { e.preventDefault(); var title = $(this).data('title'); var form = $(this); var phone = form.find('input[name=phone]').val(); if (!phone) { alert('Укажите Ваш телефон'); form.find('input[name=phone]').focus(); // animate(form); return false; } var formData = new FormData(form[0]); $(form).find('input[type=file]').each(function () { formData.append(this.name, this.value); }); $.ajax({ url: '/sendMail.php?title=' + title, type: 'post', enctype: 'multipart/form-data', data: formData, processData: false, contentType: false, success: function (data) { form.trigger('reset'); successForm(); /*$('.modal').modal('hide'); $.fancybox.close(); form.trigger('reset');*/ } }); }); $('.popUpForm').click(function (e) { e.preventDefault(); printForm($(this)); }); function initPhone(){ var _container = jQuery('input[name=phone]'); if (_container.length > 0) { _container.each(function () { var _t = jQuery(this); var _this_form = _t.parents('form'); _t.inputmask("+7(999) 999-99-99",{ completed:function(){ setValue($(this)); $(this).parents('form').find('input[type=submit]').removeClass('disabled_phone'); $(this).parents('form').find('button[type=submit]').removeClass('disabled_phone'); $(this).parents('form').removeClass('disabled_phone'); if($(this).parents('div').hasClass("wrap-form-bottom")){ $(this).parents('div').find('#sendInform').removeClass('disabled_phone'); } if($(this).parents('div').hasClass("form-calc-ceny_form")){ $(this).parents('div').find('.sendCalk').removeClass('disabled_phone'); } $(this).removeClass('disabled_phone'); }, "onincomplete": function(){ $(this).parents('form').find('input[type=submit]').addClass('disabled_phone'); $(this).parents('form').find('button[type=submit]').addClass('disabled_phone'); $(this).parents('form').addClass('disabled_phone'); if($(this).parents('div').hasClass("wrap-form-bottom")){ $(this).parents('div').find('#sendInform').addClass('disabled_phone'); } if($(this).parents('div').hasClass("form-calc-ceny_form")){ $(this).parents('div').find('.sendCalk').addClass('disabled_phone'); } $(this).addClass('disabled_phone'); var typs = _this_form.attr('id'); var dop_phone = $(this).val(); }, onKeyDown: function () { var value = $(this).val(); var maskedValue = value.replace(/\D+/g, ""); if(maskedValue.length<3){ $(this).data('city', false); } } }); }); } } function fancyForm(title, html) { var msg = '<div class="lightbox__form"><div class="lightbox__form-in">\ <div class="lightbox__form-title-top"><div class="lightbox__header">' + title + '</div></div>\ <div class="inp_wrap">'+html+'</div>\ <div id="popup_error"></div>\ </div></div>'; if (!!$.prototype.fancybox) { $.fancybox.open(msg); initPhone(); } } const Form = { /* name: '<div class="input__field"><input type="text" placeholder="Ваше имя" name="name"></div>',*/ phone: '<div class="input__field"><input type="text" autocomplete="off" inputmode="numeric" name="phone" required placeholder="Ваш телефон" /></div>', comment: '<div class="input__field"><textarea name="comment" required placeholder="Ваш комментарий"></textarea></div>', time: '<div class="input__field"><select name="time"><option value disabled selected>Когда Вам перезвонить?</option><option value="9-12 часов">9-12 часов</option><option value="12-17 часов">12-17 часов</option><option value="17-20 часов">17-20 часов</option></select></div>', date: '<div class="input__field"><input name="date" type="date"></div>', agreement: '<div class="form-label-ligtbox"><label class="form-agreement-yes d-flex justify-content-center align-items-center"><input class="agreement-yes-input" name="is_allowed_personal" checked="checked" value="1" type="checkbox"><span class="agreement-yes-custom"><img src="/templates/nova/images/check.svg"></span><span class="agreement-yes-text">Соглашаюсь с <a href="/privacy.html" target="_blank">условиями</a> обработки персональных данных</span></label></div>' }; function printForm(_form) { const buttton_title = $(_form).data('button') || 'Отправить'; const title = $(_form).data('title') || 'Заказать звонок'; const custom = $(_form).data('custom') || false; const filedsData = $(_form).data('fields'); const beforeForm = $(_form).data('bform') ? '<div class="beforeForm">'+$(_form).data('bform')+'</div>' : ''; const afterForm = $(_form).data('aform') ? '<div class="afterForm">'+$(_form).data('aform')+'</div>' : ''; let html = '<form class="normalForm" data-title="'+title+'">'+beforeForm; html += filedsData.split(',').map(function (i) { return Form[i]; }).join(''); html += Form['agreement']; html += '<div class="text-center"><button type="submit" class="btn btn-yellow d-inline-block btn-x-20"><span>'+ buttton_title +'</span></button></div>'; html += afterForm+'</form>'; if(custom){ fancyForm(custom, html); }else{ fancyForm(title, html); } const callback = $(_form).data('callback') || false;; if(callback){ if (typeof window[callback] === 'function') { setTimeout(function(){ window[callback].call() console.log(callback) }, 100); } } }
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Елена Вебер Ответ

Если форма создаётся динамически после клика, скрытый input нужно добавлять не при загрузке страницы, а в момент, когда форма уже появилась в DOM. Иначе скрипт просто не найдёт форму. Самый надёжный вариант - после создания формы сразу вставить input через appendChild или insertAdjacentHTML.

Пример:

document.addEventListener('click', function (event) {
  const button = event.target.closest('[data-open-form]');
  if (!button) return;
 
  const source = button.dataset.otkuda || 'unknown';
 
  const form = document.querySelector('.popup form');
  if (!form) return;
 
  let input = form.querySelector('input[name="data-otkuda"]');
 
  if (!input) {
    input = document.createElement('input');
    input.type = 'hidden';
    input.name = 'data-otkuda';
    form.appendChild(input);
  }
 
  input.value = source;
});

document.addEventListener('click', function (event) { const button = event.target.closest('[data-open-form]'); if (!button) return; const source = button.dataset.otkuda || 'unknown'; const form = document.querySelector('.popup form'); if (!form) return; let input = form.querySelector('input[name="data-otkuda"]'); if (!input) { input = document.createElement('input'); input.type = 'hidden'; input.name = 'data-otkuda'; form.appendChild(input); } input.value = source; });

В кнопке тогда можно хранить значение:

&lt;button type="button" data-open-form data-otkuda="hero"&gt;Открыть форму&lt;/button&gt;

&lt;button type="button" data-open-form data-otkuda="hero"&gt;Открыть форму&lt;/button&gt;

Если форма появляется не сразу, а через AJAX или плагин сначала открывает попап, а потом дорисовывает HTML, добавьте небольшое ожидание или обработчик события самого попапа. Но setTimeout - запасной вариант, лучше цепляться к событию плагина.

setTimeout(function () {
  const form = document.querySelector('.popup form');
  if (!form) return;
  form.insertAdjacentHTML('beforeend', '&lt;input type="hidden" name="data-otkuda" value="hero"&gt;');
}, 300);

setTimeout(function () { const form = document.querySelector('.popup form'); if (!form) return; form.insertAdjacentHTML('beforeend', '&lt;input type="hidden" name="data-otkuda" value="hero"&gt;'); }, 300);

Если это Contact Form 7, скрытое поле лучше заранее добавить в форму через шорткод, а значение менять JS-ом:

[hidden data-otkuda id:data-otkuda]

[hidden data-otkuda id:data-otkuda]

Так форма не ломается при валидации, поле участвует в отправке, а JS отвечает только за подстановку конкретного значения.

Отдельно проверьте, что у input есть именно name, а не только id. В отправку формы попадают поля с name. Ещё лучше не добавлять скрытое поле повторно при каждом открытии попапа: сначала ищите существующее поле, затем обновляйте value. Иначе в заявке могут прийти несколько одинаковых параметров, а сервер возьмёт не то значение.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно