Cheizer
@Cheizer

Как отправить AJAX форму, которая создана на лету?

Друзья, вроде обычное дело, но вот застрял, весь день копаюсь и не пойму как это сделать.

Есть скрипт отправки форм с сайта AJAXом, все просто и работает ЕСЛИ форма с id уже существовала при загрузке страницы.
НО если id добавить динамически по событию CLICK например по кнопке, то получается такой формы для AJAX скрипта не существует, и мол надо как то перезагрузить DOM дерево? Или что вообще нужно?

Вот пример как работает (код упростил, оставил суть):

Форма:
<form id="form1" class="form">
                        <input type="text" value="" placeholder="Введите ваше имя:">
                        <input type="tel" value="" placeholder="Введите ваш телефон:">
                        <a href="#" data-type="submit">ОТПРАВИТЬ ЗАЯВКУ</a>
</form>


Отправляю:
$(window).load(function () {
    $('#form1').forms({
        ownerEmail: 'example@mail.ru',
        product: 'Заявка с сайта'
    })


Подключаемый внизу страницы js файл с логикой
$.ajax({
                                type: "POST",
                                url: '/MailHandler.php',
                                data: {
                                    name: _.getValFromLabel($('.name', _.form)),
                                    phone: _.getValFromLabel($('.phone', _.form)),
                                    pro_duct: _.product,
				    owner_email:_.ownerEmail,
                                    stripHTML: _.stripHTML
                                }
                            })


/*-------------------------------------------------------------*/

НО ЕСЛИ id формы генерить ПОСЛЕ загрузки страницы по событию CLICK, то форма не отправляется :(

<a href="#" data-id="['динамический id']" class="btn">услуга</a>

$('.btn').on('click', function () {
    var dataidx = $(this).attr('data-id');
    $('form').attr('id','form'+dataidx);
});


Форма:
<form id="form['динамический id']" class="form">
                        <input type="text" value="" placeholder="Введите ваше имя:">
                        <input type="tel" value="" placeholder="Введите ваш телефон:">
                        <a href="#" data-type="submit">ОТПРАВИТЬ ЗАЯВКУ</a>
</form>


Отправляю:
$(window).load(function () {
    $('#form['динамический id']').forms({
        ownerEmail: 'example@mail.ru',
        product: 'Заявка с сайта'
    })


Как быть в таком случае? Как поступают при таких раскладах?
Очень не хочется для каждой услуги распечатывать свою форму сразу, хочется менять динамически одну форму подставляя id услуги.
  • Вопрос задан
  • 467 просмотров
Решения вопроса 1
ShadowOfCasper
@ShadowOfCasper
Middle User Interface Web Developer
Всё просто. Когда ты динамически создаёшь новый компонент по клику, после инициализации всех скриптов, компонент не привяжется к своей логике. Просто потому что сначала создаём - потом инициализируем логику. Если логика уже обработана браузером, при добавлении новой разметки она не привяжется к своей логике, но это легко поправить.
Пишем в переменную 2 разные функции. В первой - динамическое добавление разметки в DOM, во второй - логика, которую нужно привязать к разметке. Условно назову их create() и initAjaxOnForm().
Как только document ready - в коллбэк create(в аргументы закинем селектор родителя, куда пулять разметку) потом ajaxForm(в аргументы селектор компонента)
Так же и в btn.click ->
create(node)
ajaxForm('.form')

А вообще для подобных нужд есть Vue / React и прочие
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Justique
@Justique
$(document).on('click', '.btn', function () {
 ...
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы