Haseri
@Haseri
Веб-разработчик

Почему Ajax срабатывает только со второго раза?

Есть более-менее стандартная форма, которая проверяется при помощи Ajax.
Проблема в том, что она начинает работать только со второго раза, после перезагрузки страницы.
Еще трудности добавляет то, что код - не мой и у меня плохо получается разобраться, в чем проблема.

Ссылка на саму форму: https://www.advantika.ru/test.php

JS:
$('.form form').submit(function(e) {
    if(!! window.FormData){
        e.preventDefault();
        $form = $(this);
        $submitButton = $form.find('[name="web_form_submit"]');
        $submitButton.addClass('proceed').prop('disabled', true);
        var formData = new FormData(this);
        formData.append('web_form_submit', $submitButton.val());
        $.ajax( {
            url: 'https://www.advantika.ru/_formHandler.php',
            type: 'POST',
            data: formData,
            processData: false,
            contentType: false,
            cache: false,
            success: function(response){
                $response = $(response);
                if($response.find('.form-form-note').length > 0){
                    if('order' == $form.attr('name')){
                        var checkedServices = [];
                        $form
                        .find('.form-services')
                        .find('[type=checkbox]')
                        .each(function(){
                            if(true === $(this).is( ':checked' )){
                                checkedServices.push($(this).attr('data-gtm-val'));
                            }
                        });
                        var gtmEventLabel = document.URL + '|' + checkedServices.join('.') + '|';
                    }else{
                        var gtmEventLabel = document.URL;
                    }
                    dataLayer.push({
                        'event': 'adv.event',
                        'eventCategory': 'formSubmit',
                        'eventAction': $form.attr('name'),
                        'eventLabel': gtmEventLabel,
                        'eventValue': 0,
                        'eventNonInteraction': false
                    });
                    $form.find('.form-element input').val('');
                    $form.find('.form-element textarea').val('');
                    $form.find('input[type=checkbox]').prop('checked', false);
                }
                $form.find('.form-messages').stop().html($response.find('.form-messages').stop().html());
                $submitButton.prop('disabled', false).removeClass('proceed');
            }
        });
        return false;
    }else{
        $(this).submit();
    }
});
  • Вопрос задан
  • 399 просмотров
Решения вопроса 1
Haseri
@Haseri Автор вопроса
Веб-разработчик
Оказалось, что решение - заменить $('.form form').submit(function(e) { на $(document).on('submit','.form form', function(e){
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
iit
@iit
TeamLead + php/js разработчик
При загрузке страницы по какой-то причине jquery событие не связанно с формой следовательно

$('.form form').submit(function(e) {
...

Не отрабатывает

Причина скорее всего в порядке загрузке скриптов, другой скрипт модифицирует dom формы в результате чего привязка к событию теряется. А таких скриптов я обнаружил более одного, но что они делают я не могу сказать так как они минифицированные.

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

Как костыль могу посоветовать навесить отдельный обработчик на саму кнопку дабы он всегда перехватывал событие по умолчанию и вызывал submit на самой форме
Ответ написан
Ваш ответ на вопрос

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

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