Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Странность AJAX


Автор: DoubleBubble 10.9.2014, 13:20
Здравствуйте. Возникла проблема при использовании AJAX. Технологию только начинаю юзать.
Есть такой AJAX-запрос:
Код

$.ajax({
    type: 'POST',
    url: '/pages/registrationnonexist.php',
    data: 'm=check&email=lalka',
    complete: function() {
        notices.email = 'Пользователь с таким e-mail уже зарегистрирован!';
    }
});

Здесь - тестовый кусок скрипта регистрации, загружающий несуществующую страницу. В настройке "complete" я объявляю свойство объекта "notice" "email". Но оно не выходит за пределы этой функции! Почему так?

Автор: Aliance 10.9.2014, 14:35
Внутри complete переменная notices же только лишь используется, тогда уточните где и как она объявляется?
Так же напишите, как идет к ней последующее обращение, после чего вы решили, что она "не выходит за пределы функции".

Добавлено через 3 минуты и 3 секунды
В общем случае могу ответить так: вам нужно почитать про замыкания и области видимости (scope), рекомендую http://shamansir.github.io/JavaScript-Garden/#function. Конкретнее скажу после ваших ответов на мои вопросы выше smile

Автор: DoubleBubble 10.9.2014, 15:36
Код

$(function() {
    
    // ...
    
    /*function show_notices (object, action)
    {
        if (action == 'show')
        {
            for (k in object)
            {
                if (k == 'birth')
                {
                    $('#registration_' + k + '_notice').text(object[k]);
                    $('#registration_' + k + '_notice_table_cell, #registration_' + k + '_notice').show();
                }
                else if (k == 'recaptcha')
                {
                    $('#registration_' + k + '_notice').text(object[k]).css('display', 'inline-block');
                }
                else
                {
                    $('#registration_' + k + '_notice').text(object[k]).show();
                }
            }
        }
        else if (action == 'hide')
        {
            for (k in object)
            {
                if (k == 'birth')
                {
                    $('#registration_' + k + '_notice').text('');
                    $('#registration_' + k + '_notice_table_cell, #registration_' + k + '_notice').hide();
                }
                else
                {
                    $('#registration_' + k + '_notice').text('').hide();
                }
            }
        }
    }*/
    
    var notices = {<? echo $notices_string; ?>};
    show_notices (notices, 'show');
    
    $('#registration_button').click(function() {
        show_notices (notices, 'hide');
        notices = {};
        
        /* Фамилия.
        if (!$('#registration_second_name').val().trim())
        {
            notices.second_name = 'Заполните поле!';
        }
        else
        {
            if ($('#registration_second_name').val().trim().length > 60 || /[^a-zA-Zа-яА-ЯёЁ\-]/.test($('#registration_second_name').val().trim()))
            {
                notices.second_name = 'Неверная фамилия!';
            }
        }*/
        
        // ...
        
        /* E-mail. */
        if (!$('#registration_email').val().trim())
        {
            notices.email = 'Заполните поле!';
        }
        else
        {
            if ($('#registration_email').val().trim().length < 5 || $('#registration_email').val().trim().length > 60 || !/@/.test($('#registration_email').val().trim()) || !/\./.test($('#registration_email').val().trim()) || /[^\w-@.]/i.test($('#registration_email').val().trim()))
            {
                notices.email = 'Неверный e-mail!';
            }
            else
            {
                $.ajax({
                    type: 'POST',
                    url: '/pages/registration.php',
                    data: 'm=check&email=lalka',
                    complete: function() {
                        notices.email = 'Пользователь с таким e-mail уже зарегистрирован!';
                        alert (notices.email); // 'Пользователь с таким e-mail уже зарегистрирован!'
                    }
                });
                
                alert (notices.email); // 'NaN'
            }
        }
        
        // ...
        
        if (object_is_empty(notices))
        {
            $('form').submit();
        }
        else
        {
            show_notices (notices, 'show');
            
            var first_notice = '#registration_' + object_first_element(notices, 'k') + '_notice';
            
            $('html, body').animate({
                scrollTop: ($(first_notice).offset().top - $('.header').outerHeight() - 30) + 'px'
            }, 800, 'linear');
        }
    });
});

Автор: _zorn_ 11.9.2014, 03:03
Код
$.ajax({
                    type: 'POST',
                    url: '/pages/registration.php',
                    data: 'm=check&email=lalka',
                    complete: function() {
                        notices.email = 'Пользователь с таким e-mail уже зарегистрирован!';
                        alert (notices.email); // 'Пользователь с таким e-mail уже зарегистрирован!'
                    }
                });
                
                alert (notices.email); // 'NaN'

Второй алерт выполнится раньше того как отработает аякс запрос.

Автор: Aliance 11.9.2014, 09:18
Кроме того, у вас переменная notices объявлена внутри замыкания, она не будет доступна в глобальном контексте window.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)