Автоматическое закрытие окна FancyBox
Есть форма обратной связи в модальном окне FancyBox.
Нужно сделать что бы после успешной отправки заявки это модальное окно закрывалось автоматически. Я сделал закрытие через setTimeout. Но окно закрываться при нажатии на кнопку Отправить вне зависимости от того отправилась форма или нет. Помогите пожалуйста исправить. <script> $(document).ready(function(){ /*ПРОВЕРЯЕМ НАЖАТА ЛИ КНОПКА ОТПРАВКИ*/ $('#btn_submit').click(function(){ // собираем данные с формы var user_name = $('#name').val(); var user_email = $('#email').val(); var user_phone = $('#phone').val(); var text_comment = $('#text_comment').val(); // отправляем данные $.ajax({ url: "/php/send.php", // куда отправляем type: "post", // метод передачи data: { // что отправляем "name": user_name, "email": user_email, "phone": user_phone, "text_comment": text_comment }, error:function(){$("#erconts").html("Произошла ошибка!");}, /* если произойдет ошибка в элементе с id erconts выведится сообщение*/ beforeSend: function() { $("#erconts").html("Отправляем данные..."); }, success: function(result){ /* В случае удачной обработки и отправки выполнится следующий код*/ $('#erconts').html(result); setTimeout($.fancybox.close(), 2000); console.log("ntcn"); } }); }); }); </script> |
Цитата:
|
Цитата:
setTimeout($.fancybox.close, 2000); |
Цитата:
|
maxg5,
может так повезёт :) setTimeout(function() { $.fancybox.close() }, 2000); |
рони, да у него скорее ответ приходит практически сразу, поэтому и кажется.
|
Так окно так же не закрывается плюс к этому идет задержка на отправку в количестве секунд указанных в sleep(). Возможно я что то не так оформил.
<?php /*ПОМЕЩАЕМ ДАННЫЕ ИЗ ПОЛЕЙ В ПЕРЕМЕННЫЕ*/ $name = $_POST["name"]; $email = $_POST["email"]; $phone = $_POST["phone"]; $text_comment = $_POST["text_comment"]; /*ЗДЕСЬ ПРОВЕРЯЕМ ЕСЛИ ХОТЯ БЫ ОДНО ИЗ ПОЛЕЙ НЕ ЗАПОЛНЕНО МЫ ВОЗВРАЩАЕМ СООБЩЕНИЕ*/ if($name=="" or $email=="" or $phone=="" or $text_comment==""){ echo "Заполните все поля"; } else{ /*ЕСЛИ ВСЕ ПОЛЯ ЗАПОЛНЕНЫ НАЧИНАЕМ СОБИРАТЬ ДАННЫЕ ДЛЯ ОТПРАВКИ*/ $to = "maxg5@yandex.ru"; /* Адрес, куда отправляем письма*/ $subject = "Письмо с обратной связи"; /*Тема письма*/ $headers = "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=utf-8\r\n"; $headers .= "From: <test@mail.ru>\r\n";/*ОТ КОГО*/ /*ВО ВНУТРЬ ПЕРЕМЕННОЙ $message ЗАПИСЫВАЕМ ДАННЫЕ ИЗ ПОЛЕЙ */ $message .= "Имя пользователя: ".$name."\n"; $message .= "Почта: ".$email."\n"; $message .= "Телефон: ".$phone."\n"; $message .= "Сообщение: ".$text_comment."\n"; /*ДЛЯ ОТЛАДКИ ВЫ МОЖЕТЕ ПРОВЕРИТЬ ПРАВИЛЬНО ЛИ ЗАПИСАЛИCM ДАННЫЕ ИЗ ПОЛЕЙ*/ $send = mail($to, $subject, $message, $headers); /*ЕСЛИ ПИСЬМО ОТПРАВЛЕНО УСПЕШНО ВЫВОДИМ СООБЩЕНИЕ*/ if ($send == "true") { echo "Ваше сообщение отправлено. Мы ответим вам в ближайшее время.\r\n"; } /*ЕСЛИ ПИСЬМО НЕ УДАЛОСЬ ОТПРАВИТЬ ВЫВОДИМ СООБЩЕНИЕ ОБ ОШИБКЕ*/ else { echo "Не удалось отправить, попробуйте снова!"; } } sleep(3); ?> <script type="text/javscript"> $.fancybox.close </script> |
setTimeout(function() { $.fancybox.close() }, 2000); Так окно закрывается в независимости от того отправилась форма или нет. |
Цитата:
И если мне не изменяет память, то у FancyBox есть свой метод Ajax. |
Цитата:
|
Цитата:
|
maxg5, я могу и ошибаться, так что лучше глянуть API, но содержимое его можно подгружать ajax запросом, типа
$('селектор').fancybox({ type: 'ajax', ajax : { type : "POST", data : данные } }); Загрузив таким образом форму, после отправления которой, закрыть окно, к которому доступ проще будет. |
С API FancyBox я не разберусь.
Можете дать пример кода пожалуйста на модальное c формой бех без использования FancyBox. Мне нужно в обще две формы сделать. 1. Форма в модальном окне. Что бы окно зарвалось после успешной отправки. 2. И форма после отправки которой модальное окно появляется через 3с и исчезает. Ищу примеры, не могу найти. |
Цитата:
|
Цитата:
|
Опечатка была:
форма после отправки которой модальное окно появляется НА 3 секунды и исчезает |
Цитата:
2) Если после отправления формы, должно появится окно на N сек, то форма также из окна отправляется, а окно после отправки, это сообщение результата отправления? |
Цитата:
2. окно на N секунд должно появляться только для второй формы. Окно после отправки, это сообщение результата отправления формы. |
<? if($_POST) { if(isset($_POST['sleep'])) sleep(3); exit(print_r($_POST, 1)); } ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.css" type="text/css" media="screen" /> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.js"></script> <script type="text/javascript"> $(function() { $(".modalbox").fancybox({ padding: 20, frameWidth: 400, frameHeight: 300, overlayOpacity: 0.7 }); $('#feedback').submit(function(e) { var f = $(this); e.preventDefault(); $.ajax({ type: 'post', url: location, data: f.serialize(), success: function(d) { $('pre').text(d); $.fancybox.close(); //закрывается только после ответа } }) }); $('#feed_message').submit(function(e) { var f = $(this); e.preventDefault(); $.ajax({ type: 'post', url: location, data: f.serialize(), success: function(d) { //показать сообщение $.fancybox.open({ content: '<p>Done!</p>', afterShow: function() { $(this.skin[0]).find('a.fancybox-close').hide(); var tm = setTimeout(function() { //скрыть сообщение $.fancybox.close(); clearTimeout(tm) }, 3000) } }) } }) }); }); </script> </head> <body> <div> <p><a href="#feedback" class="modalbox">Sender</a></p> <div style="display: none;"> <h2>Send form</h2> <form id="feedback"> <input name="name" value="as"><br> <input name="email" value="as@as.as"><br> <input type="hidden" name="sleep" value="1" /> <button>Send</button> </form> </div> </div> <pre> </pre> <div> <p>Message</p> <form id="feed_message"> <input name="name" value="as"><br> <input name="email" value="as@as.as"><br> <button>Send</button> </form> </div> </body> </html> Спрятать кнопку close можно опционально (только опция closeBtn у другой версии может отличаться, то есть ее имя), и если сообщение формирует сервер, значит его определять в опциях: success: function(data) { $.fancybox.open({ content: data, afterShow: function() { var tm = setTimeout(function() { $.fancybox.close(); clearTimeout(tm) }, 3000) }, closeBtn: false //или modal: true, должна скрываться по определению во всех версиях }) } |
Цитата:
Применил Ваш код к своему сайту. Но у меня почему то в модальном окне, при нажатии на кнопку Отправить окно закрывается и все. Должно выдаться сообщение в этом же модальном окне(Где нибудь под кнопкой отправить) Ваша заявка отправлена. И через 3 секунды окно закрыться должно. php добавил тот что я выше показывал. В чем может быть проблема? Вот сайт. Модальное окно прикручено к кнопке Онлайн заявка только в шапке под номером которая. |
Цитата:
Цитата:
$('pre').text(d); //ответ помещаем в ... f.closest('.fancybox-skin').find('a').trigger('click') //закрываем окно Кстати, можно закрыть и так $.fancybox.close(), никаких других открытий одновременно у вас не видно. А судя по ответу, сервер не дурак, что хорошо, проверяет данные пришедшие, и если обязательно поле пустое, то возвращает сообщение. Вот только плохо, что это обычный текст, так что не понять, то-ли были ошибки приема, то-ли все Ок. Для диалога удобнее json-формат, вот тогда закрывать окно нужно только если север не вернул ошибок. |
Получается мне нужно обработчики дописать? Это в php писать как я понимаю?
По итогу получается нужно мой PHP подправить под Ваш код? |
Прервали меня, отправил автоматом, но не все.
Если нужно чтобы и по отправлению и первой формы (та что в окне), после отправки вывести сообщение об успешной ее приемке, а потом закрыть окно спустя время, то нужно не новое окно открывать, а использовать это же, заменив его контент (форму) на сообщение. Ну и закрыть по таймеру. Цитата:
А вообще, добавьте обязательным полям атрибут required и все браузеры поддерживающие его не позволят отправлять форму с незаполненными такими полями. А те что не поддерживают получат ошибку от сервера. В общем нужно не просто жмахнул и отправил форму, а писать диалог клиент-сервер. |
Часовой пояс GMT +3, время: 06:10. |