Как через JS отследить успешную отправку аяксовой вебформы?

Главные вкладки

Аватар пользователя gun_dose gun_dose 30 июля 2018 в 10:45

Речь идёт о друпал 8. Суть проблемы в следующем - в аяксовых формах на кнопках блочится событие submit, соответственно и слетает HTML5-валидация, поэтому отправка аякс-запроса происходит в любом случае. Просто если форма не валидная, то появляется сообщение об этом и подсвечивается нужное поле. То есть в любом случае у нас отправляется пост-запрос на один и тот же урл с одними и теми же параметрами. И всегда приходит ответ со статусом 200 и набором аякс-команд. В результате невозможно корректно настроить цели - некорректные отправки будут считаться вместе с успешными, что может очень сильно исказить статистику. Понятное дело, что можно джаваскриптом перебирать все команды и искать в них, скажем, фразу "спасибо, наш менеджер скоро свяжется с вами", но это слишком тупо и абсолютно не универсально.

У кого какие мысли?

Комментарии

Аватар пользователя adano adano 30 июля 2018 в 10:52

gun_dose wrote:

можно джаваскриптом перебирать все команды и искать в них, скажем, фразу "спасибо, наш менеджер скоро свяжется с вами"

мсье знает толк...
имхо, класс к элементу проще добавить.

Аватар пользователя gun_dose gun_dose 30 июля 2018 в 11:04

К какому?))

Тут подумал ещё, у сообщения с подтверждением есть же своя обёртка. В принципе достаточно же её наличия.

Аватар пользователя adano adano 30 июля 2018 в 11:22

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

Аватар пользователя fairrandir fairrandir 30 июля 2018 в 11:09

Теоретически, в восьмёрке можно создать event-listener onkernelresponse, в нём проверять, не ответ ли это на успешный сабмит вебформы, если да - добавлять свою команду на достижение цели.

Аватар пользователя gun_dose gun_dose 30 июля 2018 в 11:19

чот сложно. Реально проще будет сделать проверку типа

if ($('.webform-submission-contact-form .webform-confirmation').length) {
  // Сделать что-то там
}

Странно, что сразу не догадался.