Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Возврат значения функции после завершения анимации (затухания) (https://javascript.ru/forum/jquery/37339-vozvrat-znacheniya-funkcii-posle-zaversheniya-animacii-zatukhaniya.html)

grego 16.04.2013 13:52

Возврат значения функции после завершения анимации (затухания)
 
Ребята, вопрос следующий:
есть джейквери-функция сабмита формы.
внутри функции последовательно через блоки if/else if/else проводится проверка элементов и значений формы, если что-то некорректно, то выводится блок с сообщением (вывод через fadeIn) и возвращается false функции, т. е. return false.
В самом последнем блоке else если все остальные проверки пройдены я хочу увести (затуханием) блок с сообщением, если таковой был вызван fadeOut и после того как анимация завершится - вернуть true, чтобы пошел сабмит на сервер.
Соотв-но пишу последовательно:
.fadeOut("slow");
return true;

Но, в реальности, как только я нажимаю сабмит - отправка данных происходит сразу же, т. е. анимация (затухание) не успевает отрабатывать.
Пытался после fadeOut ставить alert - алерт вызывается, но анимация по прежнему не отрабатывает.
Подскажите пожалуйста наиболее корректный метод решения данной проблемы. Предполагаю, что можно решить ее таймаутом, но это кажется мне каким-то жутким костылем.
Заранее благодарю.

bret 16.04.2013 14:10

Обработчик onsubmit требует ответа немедленно, он не будет ждать, когда отработает ваша функция анимации. Первое, что пришло в голову:
var forcedSubmit = false;

$('form').submit(function() {
    //* пора отправить форму
    if(forcedSubmit) {
        return true;   
    }
    
    if(условие1) {
        //* условие для отправки формы не выполняется
        //* что-то делаем   
    } 
    ...
    //* тут целая куча ваших условий
    ...
    else {
        //* условие для отправки формы выполняется
        $('div').fadeIn(5000, function() {
               forcedSubmit = true;
            $('form').submit();
        });
    }
    return false;
});

grego 16.04.2013 18:29

Спасибо!
Принял к сведению ваш вариант.

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

Hekumok 16.04.2013 18:54

Цитата:

Сообщение от grego
А можете, пожалуйста, подсказать - почему так происходит?

Вам же написали
Цитата:

Сообщение от bret
Обработчик onsubmit требует ответа немедленно, он не будет ждать, когда отработает ваша функция анимации.


grego 16.04.2013 19:57

Цитата:

Сообщение от Hekumok (Сообщение 246528)
Вам же написали

Я переспросил, поскольку ответ:
Цитата:

Сообщение от Hekumok
Обработчик onsubmit требует ответа немедленно, он не будет ждать, когда отработает ваша функция анимации.

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

Hekumok 16.04.2013 22:25

Цитата:

Сообщение от grego
почему он требует ответа немедленно, а не ждет когда последовательно отработают все функции в коде?

Ну так у вас в коде все функции отрабатываются последовательно, а затем происходит отправка формы :) Просто вы запускаете функцию jquery fadeOut, а (хоть я и не лазил в исходники jquery, но можно предположить, что) эта функция запускает setInterval. Т.е. функция выполняет необходимые действия (запуск setInterval) и выполнение кода идет дальше, а дальше у нас отправка формы. И получается, что анимация просто не успевает отработать :)


Часовой пояс GMT +3, время: 15:16.