Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проблема с глобальной переменной (https://javascript.ru/forum/misc/18929-problema-s-globalnojj-peremennojj.html)

Tuzzulino 20.07.2011 16:58

Проблема с глобальной переменной
 
Есть кнопка, к которой прикручен click(), которым руководит глобальная переменная retVal. Присваиваю ей изначально false, в теле функции в случае успеха изменяю на true. Однако все равно retVal остается false. Помогите, пжл, разобраться

var retVal = false;
			  $('#submit_reg').click(function(){
                    $('.error').empty();
                    $.post('model/checkForm.php', form.serialize(), function(data){
                      if( data.login == 1 ) {$('#errorLogin').append('такой логин уже занят'); errorLogin = 1;}
				              else if( data.login == 2 ) {$('#errorLogin').append('некорректный логин');	errorLogin = 2;	}	
			                if( data.fname == 1 ) $('#errorFname').append('укажите имя');
			                if( data.pass == 1 ) {$('#errorPass').append('некорректный пароль');errorPass=1;}
			                if( data.cp == 1 ) {$('#errorCP').append('пароли не совпадают');errorCP = 1;}
                      if(data.success1) {alert('Cond'); retVal = true;}
                      //alert(retVal);
                      }, 'json');	
                      //alert(retVal);		                
                      return retVal;
                    });

ваый 20.07.2011 17:14

$.post - асинхронный, правильно? это значит, что как выполнение программы сразу же перейдет к следующей строке, не дожидаясь, пока отработает callback ajax запроса. то есть сразу же после того как пойдет запрос на сервер, программа выполнит строку return retVal;
в этот момент retVal действительно еще false, потому что не успела измениться.
то есть все то, что вы хотите сделать в случае, когда retVal == true, нужно поместить внутрь функции обратного вызова ajax запроса.

ваый 20.07.2011 17:20

и вообще, надо отучаться обрабатывать отправку формы через событие щелчка по кнопке (а если я захочу форму отправить, нажав на Enter? низя?). click, это хорошо, но мы сабмитим форму, и для этого у нее есть специальное событие onsubmit.
$('#frmRegister').submit(function() {
    // тут все наши проверки корректности введенных данных...
})

Tuzzulino 20.07.2011 17:31

Спасибо.
в submit() надо использовать preventDefault() , а как это сделать если я собираюсь использовать в нем .post()? Я пробовал, если все плохо, тогда
event.preventDefault(), но чето не покатило

Tuzzulino 20.07.2011 18:08

Спасибо огроменное

ваый 20.07.2011 18:18

как-то так можно
$('#frmRegister').submit(function(e) {

    var $frm = $(this);
    e.preventDefault();
    
    // тут все наши проверки корректности введенных данных
    $.post('/register', $(this).serialize(), function(data) {
        if (data.error) {
            // что-то не так, останавливаемся, показываем ошибку
            return false;
        }

        // данные корректны, можно продолжать
        $frm.unbind().submit();
    });
})


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