Проблема с входом в jQuery

#jquery

#jquery

Вопрос:

У меня есть ссылка с двумя классами:

 <a href="#" class="loginable postStory">Share Your Quirks</a>
  

loginable проверяет, вошел ли пользователь в систему, и, если нет, отображает всплывающее окно «модального» входа:

 $(".loginable").live("click",function(e) {                        
    $.getJSON("/cfcs/global.cfc?method=userAuthenticatedamp;returnformat=json", {}, function(res,code) {
        if(res == 0){
            doSiteLogin();
        }
    });
})
  

postStory загружает форму для добавления истории:

 $(".postStory").live("click", function(e) {
    $(function() {
        $("#divCentre").load(siteRoot   "add_story.cfm?mode=create");
    })
});
  

Идея заключается в том, что после нажатия на ссылку мы не хотим показывать страницу add_story, если пользователь не вошел в систему, т. Е. Нам нужно, чтобы пользователь оставался на текущей странице ДО тех пор, пока он успешно не войдет в систему. Но в настоящее время он отображает страницу add_story И всплывающее окно входа в систему.

Чтобы понять, что я имею в виду, перейдите к www.quirkup.com и нажмите на ссылку «Поделиться своими причудами» в верхней части раздела «Истинные признания».

Проблема в том, что пользователь может закрыть модальное окно без входа в систему и может начать заполнять форму. Я понимаю, что, вероятно, смогу скрыть форму до завершения входа в систему, но мне интересно, есть ли лучший способ.

Редактировать

Функция doSiteLogin() выглядит следующим образом

 function doSiteLogin() {
        ColdFusion.Window.create('loginwindow','Login','/inc_site_login_form.cfm',{x:400,y:300,height:200,width:300,center:true,modal:true});
    }

    function handleSiteLogin() {
        ColdFusion.Ajax.submitForm('siteloginform','/processLogin.cfm',handleSiteLoginResponse);
    }

    function handleSiteLoginResponse(s) { 
        var userid = s.split("^")[0] || 0;
        var firstname = s.split("^")[1] || 0;
        var lastname = s.split("^")[2] || 0;
        var usertype = s.split("^")[3] || 0;
        var confirmed = s.split("^")[4] || 0;
        var enabled = s.split("^")[5] || 0;
        var authenticated = s.split("^")[6] || 0;

        if(authenticated == 1){
            ColdFusion.Window.hide('loginwindow');
            alert('Successfully logged in.nRefreshing page...');
            window.location.reload();
        }else{
            if(confirmed != 1){
                alert('Your account has not been activated. Please ensure you have clicked the confirmation link in your email.');
                return false;
            }else if(!enabled || enabled.toLowerCase() == 'no'){
                alert('Your account is not activated. Please contact Quirkup.');
                return false;
            }else{
                alert('Your login failed. Please try again.nIf the problem persists, or you have forgotten your login details, please email info@asia-buy.com.');
                return false;
            }
        }
    }
  

Ответ №1:

Я не понимаю, почему у вас есть 2 класса и 2 события для этого… это должно быть:

 $(".loginable").live("click",function(e) {                        
    $.getJSON("/cfcs/global.cfc?method=userAuthenticatedamp;returnformat=json", {}, function(res,code) {
        if(res == 0){
            doSiteLogin();
        } else {
            $("#divCentre").load(siteRoot   "add_story.cfm?mode=create");
        }
    });
})
  

Простая инструкция else должна исправить эту часть. Теперь, когда пользователь не зарегистрирован и входит в систему, вы можете это сделать…

 function handleSiteLoginResponse(s) { 
    var userid = s.split("^")[0] || 0;
    var firstname = s.split("^")[1] || 0;
    var lastname = s.split("^")[2] || 0;
    var usertype = s.split("^")[3] || 0;
    var confirmed = s.split("^")[4] || 0;
    var enabled = s.split("^")[5] || 0;
    var authenticated = s.split("^")[6] || 0;

    if(authenticated == 1){
        ColdFusion.Window.hide('loginwindow');
        $("#divCentre").load(siteRoot   "add_story.cfm?mode=create");
    }else{
        if(confirmed != 1){
            alert('Your account has not been activated. Please ensure you have clicked the confirmation link in your email.');
            return false;
        }else if(!enabled || enabled.toLowerCase() == 'NO'){
            alert('Your account is not activated. Please contact Quirkup.');
            return false;
        }else{
            alert('Your login failed. Please try again.nIf the problem persists, or you have forgotten your login details, please email info@asia-buy.com.');
            return false;
        }
    }
}
  

Нет причин перезагружать страницу. Кроме того, никогда не используйте метод «Alert ()», чтобы сообщить что-то пользователю. Это останавливает всю страницу от каких-либо действий. Это буквально замораживает javascript.

Комментарии:

1. Потому что loginable — это универсальная функция для ЛЮБОЙ ссылки, для которой сначала требуется войти в систему.

2. Затем просто покажите им форму входа пользователя через перенаправление. Странно (и сложно с точки зрения программирования) обрабатывать аутентификацию пользователя с помощью javascript.

3. Страница перезагружается, чтобы выполнить повторную проверку в переменной сеанса пользователя, чтобы отобразить функции и ссылки для тех, кто вошел в систему. Я ХОЧУ, чтобы обработка останавливалась после предупреждений. Я даже добавил ошибки возврата, чтобы убедиться, что это произойдет. Забудьте о том, как я это запрограммировал. Мне просто нужно решение, чтобы не отображать форму до завершения входа в систему, и я буду счастлив.