代码之家  ›  专栏  ›  技术社区  ›  July333

如何在页面加载时保持界面视图?

  •  0
  • July333  · 技术社区  · 6 年前

    提交事件 我从收信人那里做了些事情 数据 ,当我 刷新 甚至当我做我所做的 如果sessionstorage.token )它不起作用。我用同样的方法 javascript 以前,我发誓它起作用了。

    如何解决这个问题?请帮帮我。

                // Initialize variables
                var $jUser = {};
                var $ajUsers = [];
    
                // Login POST 
                $('#frm-login').submit(function (e) {
                    event.preventDefault()
                    $loginButton.text('Please wait ...').prop('disabled')
                    $.ajax({
                        url: "/login-user",
                        type: "POST",
                        data: $('#frm-login').serialize(),
                    dataType: "json"
                }).always(function (response) {
                    $loginButton.text('Logging in').prop('disabled')
                    console.log("Login", response)
                    if (response.status == "error") {
                        $loginButton.removeClass('lime').addClass('red').text('Log in failed. Try again.');
                        return
                    }
                    sessionStorage.setItem('token', response.token)
                    if (sessionStorage.token) {
                        $.ajax({
                            type: "GET",
                            url: "/verify-user",
                            headers: {
                                'Authorization': 'Bearer ' + sessionStorage.token
                            },
                            dataType: "json"
                        }).always(function (response) {
                            console.log("Auth", response)
                            if (response.status == "error") {
                                $loginButton.removeClass('lime').addClass('red').text('Log in failed. Try again.');
                                return
    
                            }
                            $('#index-page').css('display', 'none')
                            $('#main-page').css('display', 'block')
                            $.getScript('/js/socket.js', function () {
                                console.log('script loaded');
                            });
                            $jUser = response.authData.user
                            $userAvatar.attr('src', $jUser.avatar)
                            $userFullname.text($jUser.first_name + ' ' + $jUser.last_name)
                            console.log($jUser)
                        })
                    }
                })
            })
            console.log($jUser)
            if (sessionStorage.token) {
                function userSession() {
                    $('#index-page').css('display', 'none')
                    $('#main-page').css('display', 'block')
                    $userAvatar.attr('src', $jUser.avatar)
                    $userFullname.text($jUser.first_name + ' ' + $jUser.last_name)
                    console.log('hello')
                }
            }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Bill Doughty    6 年前

    首先,您似乎没有调用函数 userSession 任何地方。您只是在最后的令牌测试中定义它。

    还有,你打电话来 always 在JQXHR返回的 $.ajax 呼叫。这个 总是 方法将被调用,不管Ajax请求是否成功,并根据请求的状态向提供的函数传递不同的参数。查看 jQuery deferred method documentation . 我想你想用 success 的属性 $ ajax 实现所需的参数。

    最后,我看不出你在哪里 $jUser 但您的代码似乎假定它在页面加载过程中被持久化。但是,它被重置为空对象( {} )每次执行JavaScript时(每次页面加载时)。您可能希望将其序列化并保存在 sessionStorage 对象,因此它将保持,然后测试它并将其取消序列化为 $JUSER 如果是存储的。或者,您可以打电话 verifyUser 在每个页面上使用存储的令牌加载(如果存在的话),这将降低效率,但应该可以工作。

    在没有访问服务器进行Ajax调用的情况下,我无法测试对您的代码所做的更改,但无论如何,我都会发布它们,您可以自己尝试它们。如果有帮助请告诉我。

    // Initialize variables
    var $jUser = {};
    var $ajUsers = [];
    var jUserJSON;
    
    function failedLogin() {
        // handle failed logins
        $loginButton.removeClass('lime').addClass('red').text('Log in failed. Try again.');
        $loginButton.text('Login').prop('disabled', false);
    }
    
    function ajaxError(url, testStatus, errorThrown) {
        console.log("The " + url + " Ajax request failed. status:" + textStatus + ', errorThrown: ' + errorThrown);
    }
    
    function updatePageWithLogin() {
        $('#index-page').css('display', 'none');
        $('#main-page').css('display', 'block');
        $userAvatar.attr('src', $jUser.avatar);
        $userFullname.text($jUser.first_name + ' ' + $jUser.last_name);
        $.getScript('/js/socket.js', function () {
            console.log('script loaded');
        });
    }
    
    function verifyUser(token) {
        $.ajax({
            type: "GET",
            url: "/verify-user",
            headers: {
                'Authorization': 'Bearer ' + token
            },
            dataType: "json",
            success: function (response) {
                console.log("Auth", response)
                if (response.status == "error") {
                    failedLogin();
                    return;
                }
    
                $jUser = response.authData.user;
    
                // persist the $jUser object
                jUserJSON = JSON.stringify($jUser);
                sessionStorage.setItem('juser', jUserJSON);
                console.log("$jUser: " + jUserJSON);
                updatePageWithLogin();
            },
            error: function(jqXHR, textStatus, errorThrown) {
                ajaxError("/verify-user", textStatus, errorThrown);
            },
            complete: function() {
                // This will get called whether the Ajax request succeeds or fails
            }
        });
    }
    
    // Login POST
    $('#frm-login').submit(function (e) {
        event.preventDefault();
        $loginButton.text('Please wait ...').prop('disabled');
        $.ajax({
            url: "/login-user",
            type: "POST",
            data: $('#frm-login').serialize(),
            dataType: "json",
            success: function(response) {
                $loginButton.text('Logging in').prop('disabled', true);
                console.log("Login", response)
                if (response.status == "error") {
                    failedLogin();
                    return;
                }
                sessionStorage.setItem('token', response.token); // not sure this is necessary now
                if (response.token) { verifyUser(response.token) }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                ajaxError("/login-user", textStatus, errorThrown);
            },
            complete: function() {
                // This will get called whether the Ajax request succeeds or fails
            }
        })
    });
    
    jUserJSON = sessionStorage.getItem("juser");
    
    if (jUserJSON) {
        // The user has already authenticated
        $jUser = JSON.parse(jUserJSON);
        updatePageWithLogin();
    }
    
    console.log("$jUser: " + jUserJSON);