javascript中ajax登录退出一些方法总结

版本一
思路是在页面中指定位置预留一个js钩子, 然后在页面加载完成后向后端发送ajax请求, 判断用户是否登录, 并写到钩子里相应文本. 于是版本一产生了...

 代码如下 复制代码

(function($){
    var user = window.user = {};

    // 用户数据
    user.data = {};

    // 用户状态, 0未登录, 非0则视为已登录, 可扩展为用户等级
    user.status = 0;

    /**
     * 初始化
     * @return {object} user对象
     */
    user.init = function(){
        //负责从后端ajax请求用户是否登录, 如果已登录则返回用户相关信息, 否则视为未登录
        //请求完成后改变用户的status状态, 并把用户信息写入到user.data上

        $.get("后端url", function(res){
            if(res.error === 0){//返回值同后端协定
                user.status = 1;
                user.data.userName = res.data.userName;//模拟用户名
            } else {
                user.status = 0;
                user.data = {};
            }

            //渲染状态到页面
            user._renderHTML();
        }, 'json');

        //模拟惰性方法以防止页面多次使用
        user.init = function(){
            return user;
        }

        return user;
    }

    /**
     * 用户登录
     * @param  {Function} callback 回调
     * @return {object}            user对象
     */
    user.login = function(callback){
        if("function" === typeof callback){
            if(user.status !== 0){//如果用户已登录则直接运行回调, 参数为用户数据
                callback.call(user, user.data);
            } else {
                //未登录时弹出用户登录层,让其登录, 登录完成后刷新当前页面, 当然也可以像 youku 一样不刷新页面, 但要做的工作非常多, 这里不解释
            }
        }

        return user;
    }

    /**
     * 渲染用户状态到页面, 当前为模拟用
     */
    user._renderHTML = function(){
        var html;

        if(user.status !== 0){//已登录
            html = '您好 '+ user.data.userName +' , <a href="#">退出</a>';
        } else {
            html = '请先登录<a href="#">登录</a>';
        }

        $("#J_bar_html").html(html);
    }
}(jQuery));
页面中可以这么干:
<a href="javascript:;" id="J_set_fav">点击收藏</a>
<script type="text/javascript">
    user.init();//初始化用户

    $("#J_set_fav").on("click", function(){
        user.login(function(){//回调必须是登录状态下使用, 如果没有登录会执行画出登录框让用户登录
            alert("正在收藏");
        });
    });
</script>

版本二
于是页面中可能需要判断用户是否登录, 还有退出登录, 在版本一的基础上添加 检查和退出方法, 但这些退出和检查只是依据后端的返回值, 且退出只是前端静态退出, 当然你也可以向后端发送ajax

 代码如下 复制代码

/**
 * 前端退出
 * @return {object} user对象
 */
user.exit = function(){
    user.status = 0;
    user.data = {};
    user._renderHTML();//重置下页面状态
    return user;
}

/**
 * 检查用户是否已经登录
 * @return {boolean} true为登录, false为未登录
 */
user.check = function(){
    return user.status !== 0;
}

经过以上代码后前端的登录退出就基本完成了, 但由于每次都要请求后端, 而这个请求是异步的, 如果返回响应时间过长, 那么在这个时间段使用 user.login, user.check 是不正确的, 因为是在ajax完成后才能正确的设置用户的登录状态, 这也好比domReady事件一样, dom树都没有建立成功就使用dom对象了, 就报错了啊... 于是她有domReady, 咱有userReady...于是版本三产生了...
版本三
在版本二的基础上添加 ready 事件, 确保必须在用户初始完成后才执行代码...

 代码如下 复制代码

var isReady = false,//用户是否初始完毕
    readyList = [];//初始化回调列表

/**
 * 渲染用户状态到页面, 当前为模拟用
 */
user._renderHTML = function(){
    // ...
    runList();//因为已经渲染完页面了, 可以执行ready回调事件了
}

/**
 * 用户ready事件
 * @param  {Function} callback 初始完成后回调
 * @return {object}            user对象
 */
user.ready = function(callback){
    if("function" === typeof(callback)){
        if(isReady){//如果已经初始完毕
            callback.call(user, user.data);
        } else {//没有的话则追加到回调列表
            readyList.push({
                callback: callback
            });
        }
    }

    return user;
}

/**
 * 执行回调事件
 */
function runList (){
    var i = 0,
        len = readyList.length;
    if(len > 0){
        for(;i<len;i++){
            readyList.callback && readyList.callback.call(user, user.data);
        }
    }

    isReady = true;//设置为已经初始完毕
    readyList.length = 0;//重置回调
    runList = $.noop;//惰性方法
}

这样来使用以确保必须在用户判断结束后才绑定事件, 从而解决误判断带来的用户体验丢失:

 代码如下 复制代码
<a href="javascript:;" id="J_set_fav">点击收藏</a>
<script type="text/javascript">
    user.init();//初始化用户
   
    user.ready(function(){
        if(user.check()){alert("已登录");} else {alert("未登录");}
        $("#J_set_fav").on("click", function(){
            user.login(function(){//回调必须是登录状态下使用, 如果没有登录会执行画出登录框让用户登录
                alert("正在收藏");
            });
        });
    });
</script>

整个前端登录, 退出大概架构就是这样了, 当然还可以对接第三方登录, 注册等方法. 还可以扩展出一些用户相关的操作, 如: 收藏啊, 添加关注啊等等.
注: 只是代码思路, 具体代码可优化, 可精简, 且跟据实际情况订制不同的功能.

时间: 2024-09-18 11:24:06

javascript中ajax登录退出一些方法总结的相关文章

javascript中AJAX 跨域问题解决方法

最近在开发过程中,使用ajax去异步调取图片.在开发中这个功能没什么问题,可以后来提测,重新部署之后就有问题了,这就是ajax的跨域问题. ajax本身是不支持跨域的,这是由于javascript的同源策略所导致.但是我们可以通过其他方法来解决ajax的跨域问题. 1  由于我们是利用了jquery来写的ajax,我们一开始是准备 利用jsonp来解决的,客户端类似下面写法  代码如下 复制代码 $.ajax({     type : "get",     async:false,  

注意JavaScript中RegExp对象的test方法

javascript|对象 javascript 中的 RegExp 对象用于正则表达式相关的操作,这个对象提供了一个方法 test 来判定某个字符串是否满足某个 pattern. 返回值是 true/false.今天我碰到了一个问题: <script type="text/javascript"><!--var re = /^\d+(?:\.\d)?$/ig;    alert(re.test('112.3'));alert(re.test('33'));//--&

在JavaScript中处理字符串之fontcolor()方法的使用

  这篇文章主要介绍了在JavaScript中处理字符串之fontcolor()方法的使用,是JS入门学习中的基础知识,需要的朋友可以参考下 此方法会导致就好像它是在一个字符串被显示在指定的颜色 标记. 语法 ? 1 string.fontcolor( color ) 下面是参数的详细信息: color: 字符串表示的颜色为十六进制RGB三元或作为一个字符串 返回值: 字符串表示的颜色为十六进制RGB三元或作为一个字符串 例子: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 1

在JavaScript中处理字符串之link()方法的使用

  这篇文章主要介绍了在JavaScript中处理字符串之link()方法的使用,是JS入门学习中的基础知识,需要的朋友可以参考下 此方法创建了请求另一个URL的HTML超文本链接. 语法 ? 1 string.link( hrefname ) 下面是参数的详细信息: hrefname: 任何字符串指定HREF标记; 它应该是一个有效的URL 返回值: 返回字符串标签 例子: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <html> <head> &

JavaScript中操作字符串之localeCompare()方法的使用

  这篇文章主要介绍了JavaScript中操作字符串之localeCompare()方法的使用,是JS入门学习中的基础知识,需要的朋友可以参考下 这个方法返回一个数字表示参考字符串是否到来之前或之后或相同的排序顺序给定的字符串. 语法 ? 1 string.localeCompare( param ) 下面是参数的详细信息: param : 字符串对象进行比较的字符串 返回值: 0 : 字符串匹配100% 1 : 不匹配,参数值来自于语言环境的排序顺序字符串对象的值之前 -1 : 不匹配,参数

JavaScript中length属性的使用方法

  这篇文章主要介绍了JavaScript中length属性的使用方法,是JS入门学习中的基础知识,需要的朋友可以参考下 此属性返回字符串中的字符数. 语法 ? 1 string.length 下面是参数的详细信息: A string 返回值: 返回字符串中的字符数. 例子: ? 1 2 3 4 5 6 7 8 9 10 11 <html> <head> <title>JavaScript String length Property</title> <

在JavaScript中使用NaN值的方法

  这篇文章主要介绍了在JavaScript中使用NaN值的方法,是JS入门学习中的基础知识,需要的朋友可以参考下 不带引号的字面常量NaN是一个特殊的值,表示不是非数字.由于NaN总是比较不等的情况,以任何数,包括NaN,它通常是用于指示应该返回一个有效的数的函数的错误条件. 注意:使用isNaN()全局函数来查看是否值是NaN值. 语法 您可以使用以下语法访问属性: ? 1 var val = Number.NaN; 示例 : 在这里,dayOfMonth分配NaN,如果是大于31,并显示一

javascript中自定义对象的属性方法分享

这篇文章介绍了在javascript中自定义对象的属性方法,有需要的朋友可以参考一下   首先介绍下关联数组: 复制代码 代码如下: <script> var test=new Object(); test["a"]=1; test["b"]="string"; test["c"]=false; alert(test["a"]); </script> 执行上面的代码,显示1. 在ja

JavaScript中消除闭包的一般方法介绍

 这篇文章主要介绍了JavaScript中消除闭包的一般方法介绍,本文直接给出了操作示例,需要的朋友可以参考下     JavaScript 的闭包是一个其主动发展的特性, 也是一个被动发展的特性. 也就是说, 一方面, JS 有了闭包能更好解决一些问题. 另一方面, JS 为了解决某些问题, 而不得不使用闭包勉强来解决问题. 前者这里不讨论, 如果 JS 闭包能更好的解决问题, 当然使用闭包更好. 我讨论的是后者, 是因为 JS 本身的限制, 而不得不磕磕绊绊地用闭包来解决的问题, 例如"变量