Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.05.2011, 17:45
Новичок на форуме
Отправить личное сообщение для Nycs Посмотреть профиль Найти все сообщения от Nycs
 
Регистрация: 26.10.2008
Сообщений: 5

Возврат функции значения из getJSON
Добрый день. Столкнулся со следующей проблемой:

Есть функция
function emailCheck(value) {
    if (check_email_address(value)) { //проверка по регулярным выр-ям
        $.getJSON("/ajax/check_email.php",{'email':value},function(json){
            if (json.success) {
                if ($("span.email").hasClass('bad')) {
                    $("span.email").removeClass('bad');
                }
                $("span.email").addClass('good');
                return true;  // это и надо вернуть. Пункт 1
            }
            else {
                if ($("span.email").hasClass('good')) {
                    $("span.email").removeClass('good');
                }
                $("span.email").addClass('bad');
                return false;  // или это. Пункт 2
            }
        });
    }
    else {
        if ($("span.email").hasClass('good')) {
            $("span.email").removeClass('good');
        }
        $("span.email").addClass('bad');
        return false;
    }
}


В коментариях в коде я пометил пункт 1 и 2, эти значения должна возвращать функция emailCheck(). Но дело в том что отправка\прием json это внутренняя функция и пункт 1 и 2 возвращают значение из этой внутренней функции. Пробовал писать return непосредственно перед $.getJSON()... - тоже без результатно...

Для передачи общей картины скажу что дальше в коде есть ивент на сабмит формы, и в теле этого сабмита есть строка
if (!emailCheck($("input.input1[name=email]").val())) { return false; }

То есть если emailCheck() возвращает false то прерывается отправка формы.

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

Последний раз редактировалось Nycs, 09.05.2011 в 17:47.
Ответить с цитированием
  #2 (permalink)  
Старый 09.05.2011, 17:58
Аватар для Starkua
Аспирант
Отправить личное сообщение для Starkua Посмотреть профиль Найти все сообщения от Starkua
 
Регистрация: 10.02.2010
Сообщений: 52

Дело в том, что Ajax запросы выполняются асинхронно. Другими словами, отдельным потоком, и true|false возвращаются не в функциу emailCheck.
Ответить с цитированием
  #3 (permalink)  
Старый 09.05.2011, 18:01
Новичок на форуме
Отправить личное сообщение для Nycs Посмотреть профиль Найти все сообщения от Nycs
 
Регистрация: 26.10.2008
Сообщений: 5

Про асинхронность это я знаю... Видимо придется заводить глобальные переменные. Другого варианта я не нашел пока(
Ответить с цитированием
  #4 (permalink)  
Старый 09.05.2011, 18:05
Аватар для Starkua
Аспирант
Отправить личное сообщение для Starkua Посмотреть профиль Найти все сообщения от Starkua
 
Регистрация: 10.02.2010
Сообщений: 52

Нужно всегда стараться избегать глобальных переменных. Тем более, в этом случае, прийдется делать таймер, который будет ждать когда сервер вернет ответ? Вариант неправильный.
Сделай все проверки в одной функции, к примеру do_check_email()
Ее вызывай, после прихода данных с сервера, и уже там, можно продолжать все остальные вычисления.
Ответить с цитированием
  #5 (permalink)  
Старый 09.05.2011, 18:08
Новичок на форуме
Отправить личное сообщение для Nycs Посмотреть профиль Найти все сообщения от Nycs
 
Регистрация: 26.10.2008
Сообщений: 5

Спасибо, пойду пробовать!!)
Ответить с цитированием
  #6 (permalink)  
Старый 09.05.2011, 18:58
Новичок на форуме
Отправить личное сообщение для Nycs Посмотреть профиль Найти все сообщения от Nycs
 
Регистрация: 26.10.2008
Сообщений: 5

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

$("#rgf").submit(function(){  // <form id="rgf" ...>...</form
        if (!emailCheck($("input.input1[name=email]").val())) { alert("bad 1"); return false; }
        if (!passCheck($("input.input1[name=pass1]").val(), $("input.input1[name=pass2]").val())) { alert("bad 2"); return false; } // тут нет аяксов
        if (!capCheck()) { alert("bad 3"); return false; }
    });


E-mail и капча проверяются аяксом и в случае отрицательного результата отправка формы должна прерваться. Подскажите пожалуйста как это реализовать. Спасибо.
Ответить с цитированием
  #7 (permalink)  
Старый 09.05.2011, 19:43
Новичок на форуме
Отправить личное сообщение для Nycs Посмотреть профиль Найти все сообщения от Nycs
 
Регистрация: 26.10.2008
Сообщений: 5

Проблему решил... судя по коду - очень сильно через то самое место.. но иначе не придумал как.
В начале функции которая реагирует на сабмит формы вставил event.preventDefault(); затем провел все проверки, при чем каждая последующая проверка запускается из тела функции предыдущей проверки при успешном проходе. Так я добрался до финиша проверок. Там я мечу форму как "хорошую" ( $("#form_id").attr('valid', '1'); ) и еще раз вручную запускаю сабмит ( $(".reg_form").submit(); ). Фокус в том что перед вызовом первой валидаторской функции я проверяю наличие атрибута valid и его равенство единице. И если такое имеется - то форма уже отправляется без остановки и валидации...

Сильно не кидайтесь помидорами... если узнаю вариант получше - возьму его.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с повторением функции getJSON kichSman jQuery 1 21.04.2011 00:50
Превращение значения обьекта в название функции. alexandre Общие вопросы Javascript 4 16.02.2011 01:04
Возврат результата функции через её параметр x-yuri Оффтопик 11 16.04.2010 11:52
возврат увеличенного значения AJAX mikeles AJAX и COMET 0 31.10.2009 08:48
Возвращение значения из функции dba Events/DOM/Window 21 06.10.2009 01:33