Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.04.2013, 13:52
Интересующийся
Отправить личное сообщение для grego Посмотреть профиль Найти все сообщения от grego
 
Регистрация: 09.01.2012
Сообщений: 26

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

Но, в реальности, как только я нажимаю сабмит - отправка данных происходит сразу же, т. е. анимация (затухание) не успевает отрабатывать.
Пытался после fadeOut ставить alert - алерт вызывается, но анимация по прежнему не отрабатывает.
Подскажите пожалуйста наиболее корректный метод решения данной проблемы. Предполагаю, что можно решить ее таймаутом, но это кажется мне каким-то жутким костылем.
Заранее благодарю.
Ответить с цитированием
  #2 (permalink)  
Старый 16.04.2013, 14:10
Аватар для bret
Кандидат Javascript-наук
Отправить личное сообщение для bret Посмотреть профиль Найти все сообщения от bret
 
Регистрация: 04.10.2008
Сообщений: 128

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

$('form').submit(function() {
    //* пора отправить форму
    if(forcedSubmit) {
        return true;   
    }
    
    if(условие1) {
        //* условие для отправки формы не выполняется
        //* что-то делаем   
    } 
    ...
    //* тут целая куча ваших условий
    ...
    else {
        //* условие для отправки формы выполняется
        $('div').fadeIn(5000, function() {
               forcedSubmit = true;
            $('form').submit();
        });
    }
    return false;
});
__________________
я подыскиваю мозг... твой подойдёт
Ответить с цитированием
  #3 (permalink)  
Старый 16.04.2013, 18:29
Интересующийся
Отправить личное сообщение для grego Посмотреть профиль Найти все сообщения от grego
 
Регистрация: 09.01.2012
Сообщений: 26

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

А можете, пожалуйста, подсказать - почему так происходит? Могу только подозревать, что причины в асинхронности или обработке функций в JS, но точные причины в данной ситуации мне к сожалению непонятны.
Ответить с цитированием
  #4 (permalink)  
Старый 16.04.2013, 18:54
Аватар для Hekumok
Отправить личное сообщение для Hekumok Посмотреть профиль Найти все сообщения от Hekumok
 
Регистрация: 04.06.2012
Сообщений: 513

Сообщение от grego
А можете, пожалуйста, подсказать - почему так происходит?
Вам же написали
Сообщение от bret
Обработчик onsubmit требует ответа немедленно, он не будет ждать, когда отработает ваша функция анимации.
__________________
★ ²º¹³ ☆
Ответить с цитированием
  #5 (permalink)  
Старый 16.04.2013, 19:57
Интересующийся
Отправить личное сообщение для grego Посмотреть профиль Найти все сообщения от grego
 
Регистрация: 09.01.2012
Сообщений: 26

Сообщение от Hekumok Посмотреть сообщение
Вам же написали
Я переспросил, поскольку ответ:
Сообщение от Hekumok
Обработчик onsubmit требует ответа немедленно, он не будет ждать, когда отработает ваша функция анимации.
с точки зрения логики понятен, но непонятен на прикладном уровне - почему он требует ответа немедленно, а не ждет когда последовательно отработают все функции в коде? Т.е. какая из особенностей джс заставляет обработчик события себя так вести, либо это особенность всех обработчиков событий.

Последний раз редактировалось grego, 16.04.2013 в 20:02.
Ответить с цитированием
  #6 (permalink)  
Старый 16.04.2013, 22:25
Аватар для Hekumok
Отправить личное сообщение для Hekumok Посмотреть профиль Найти все сообщения от Hekumok
 
Регистрация: 04.06.2012
Сообщений: 513

Сообщение от grego
почему он требует ответа немедленно, а не ждет когда последовательно отработают все функции в коде?
Ну так у вас в коде все функции отрабатываются последовательно, а затем происходит отправка формы Просто вы запускаете функцию jquery fadeOut, а (хоть я и не лазил в исходники jquery, но можно предположить, что) эта функция запускает setInterval. Т.е. функция выполняет необходимые действия (запуск setInterval) и выполнение кода идет дальше, а дальше у нас отправка формы. И получается, что анимация просто не успевает отработать
__________________
★ ²º¹³ ☆
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Условие выполняются после обработки функции sig jQuery 3 25.01.2013 13:06
Скобки после имени функции. В чем разница, если они есть и если их нет? jsuse Общие вопросы Javascript 2 19.11.2011 16:11
Определения существования анимации и возврат функции Beriagts jQuery 2 20.09.2011 21:32
Превращение значения обьекта в название функции. alexandre Общие вопросы Javascript 4 16.02.2011 01:04
Запуск функции после ресайзинга странички dummer232 jQuery 2 30.09.2010 16:23