Как через wpcf7mailsent добавить класс к одному попапу, а не всем, в которых данная форма?
Если одна и та же форма вызывается в попапах на странице несколько раз, то как обратиться к родителю конкретной форме, т.к. this не работает?
Так не работает:
document.addEventListener( 'wpcf7submit', function( event ) { if ( '123' == event.detail.contactFormId ) { $(this).parents('.modal-body').addClass('thanks-this'); } }, false ); |
document.addEventListener( 'wpcf7submit', function( event ) { if ( '123' == event.detail.contactFormId ) { $(this).parents('.modal-body').addClass('thanks-this'); } }, false );
Так работает:
document.addEventListener( 'wpcf7submit', function( event ) { if ( '123' == event.detail.contactFormId ) { $('.modal-body').addClass('thanks-this'); } }, false ); |
document.addEventListener( 'wpcf7submit', function( event ) { if ( '123' == event.detail.contactFormId ) { $('.modal-body').addClass('thanks-this'); } }, false );
Но так, естественно, новый класс прикрепляется ко всем попапам.
Дополнительно:
Если одна и та же форма вызывается в попапах на странице несколько раз, то как обратиться к родителю конкретной форме, т.к. this не работает?
У анонимных функций в js нет своего this, соответственно берется this из скоупа выше.
Но так, естественно, новый класс прикрепляется ко всем попапам.
Можно попробовать искать ближайшего родителя с css классом modal-body (т.е. настоящей формы, где сработало событие wpcf7submit):
document.addEventListener('wpcf7submit', (e) => { if ('123' === e.detail.contactFormId) { const form = e.target; const modalBody = form.closest('.modal-body'); if(modalBody) { modalBody.classList.add('thanks-this'); } else { console.log('Творится какая то дичь!'); } } }); |
document.addEventListener('wpcf7submit', (e) => { if ('123' === e.detail.contactFormId) { const form = e.target; const modalBody = form.closest('.modal-body'); if(modalBody) { modalBody.classList.add('thanks-this'); } else { console.log('Творится какая то дичь!'); } } });
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

В обработчике Contact Form 7 нужно брать не
this, а конкретную форму, на которой сработало событие. У события CF7 есть цель события:event.target. Это и есть DOM-элемент формы, которая отправилась. От него уже можно подняться к ближайшему попапу.В Вашем примере
$('.modal-body')выбирает все элементы на странице, поэтому класс добавляется всем попапам. Нужно искать ближайший родительский контейнер только относительно текущей формы:document.addEventListener('wpcf7mailsent', function (event) { if (String(event.detail.contactFormId) !== '123') { return; } const form = event.target; const modalBody = form.closest('.modal-body'); if (modalBody) { modalBody.classList.add('thanks-this'); } }, false);document.addEventListener('wpcf7mailsent', function (event) { if (String(event.detail.contactFormId) !== '123') { return; } const form = event.target; const modalBody = form.closest('.modal-body'); if (modalBody) { modalBody.classList.add('thanks-this'); } }, false);
Если попап устроен иначе, замените
.modal-bodyна общий класс именно Вашего окна:.modal,.popup,.fancybox__contentили другой контейнер. Суть та же: поиск должен идти черезclosest()от текущей формы.Если нужен jQuery-вариант:
document.addEventListener('wpcf7mailsent', function (event) { if (String(event.detail.contactFormId) !== '123') { return; } jQuery(event.target) .closest('.modal-body') .addClass('thanks-this'); }, false);document.addEventListener('wpcf7mailsent', function (event) { if (String(event.detail.contactFormId) !== '123') { return; } jQuery(event.target) .closest('.modal-body') .addClass('thanks-this'); }, false);
Важно использовать событие
wpcf7mailsent, если класс нужно добавлять только после успешной отправки письма.wpcf7submitсрабатывает после любой попытки отправки, в том числе при ошибке валидации.Итог: проблема не в Contact Form 7, а в области поиска элемента. Берите
event.target, ищите ближайший родительский попап черезclosest()и добавляйте класс только ему.