利用ajax完成简单的注册登录


一、首先我们会把ajacx进行封装,众所周知,ajax的步骤一般分为四个部分

1、创建ajax对象

const xhr = new XMLHttpRequest();

2、打开连接,里面的三个参数代表的是请求方式和连接的路径,路径的后面可以直接加?+数据;

第三个参数是布尔类型,代表是否执行异步操作,然后true代表异步,false代表同步

xhr.open('get','demo.php?id=1',true);

3、发送请求

xhr.send();

4、监听请求状态

xhr.onreadystatechange = function(){
    // 判断xhr的状态(0~4  4的时候就圆满完成)和请求的状态 - 200
    if(xhr.readyState===4 && xhr.status==200){
        // 接收响应数据
        let res = xhr.responseText;
        console(res);
    }
}        

然后post请求里面是需要在send()里面传输数据的,需要在发送请求前,设置post请求头,

模拟表单来传递数据给服务端(否则获取不到send中的参数)

//请求头
ajax.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
//send发送请求的时候要携带请求参数(键1=值1&键2=值2)
ajax.send('name=Jack&age=18&gender=男')

二、然后,我来介绍一下,简单的封装ajax

/*
封装ajax
*/ 

function sendAjax(options){
    // 处理每个选项
    // 路径必填,且是字符串
    if(!options.url){
        // 没有传url
        throw new Error("请求地址必填");
    }
    // 如果代码能走到这里,传了地址
    // 判断类型
    if(Object.prototype.toString.call(options.url) !== '[object String]'){
        // 不是字符串
        throw new Error("请求地址必须是字符串");
    }
    // 处理请求方式
    // 没有传,默认是get
    if(!options.method){
        options.method = 'get';
    }
    // 如果代码能走到这里,说明传入了
    // 判断是否是get或post
    if(options.method.toLowerCase()!=="get" && options.method.toLowerCase()!=="post"){
        // 不是get或post
        throw new Error("请求方式只接受get或post");
    }
    // 处理数据
    if(!options.data){ // 如果没传
        // 默认赋值为null
        options.data = null;
    }else{ // 如果有传入
        var data = '';
        // 判断数据是字符串还是object
        if(Object.prototype.toString.call(options.data)==='[object String]'){
            // 如果是字符串
            // 判断是否至少包含一个 =
            if(options.data.indexOf("=") === -1){
                throw new Error("数据格式有误!");
            }
            data = options.data;
        }else if(Object.prototype.toString.call(options.data)==='[object Object]'){
            // {"username":"张三","password":123456,tel:1234567810} 转为
            // 'username=张三&password=123456&tel=12345678910'
            var f = '';
            for(var attr in options.data){
                data += f + attr + "=" + options.data[attr];
                f = '&';
            }
        }
        // 代码走到这里,data都是一个字符串,是数据
        // 请求方式是否为get
        if(options.method==="get"){
            // 将数据放在地址后面
            options.url = options.url + "?" + data; // "demo.php?[object Object]"
        }
    }
    // 处理是否异步的async
    if(options.async===undefined){ // 值是undefiend表示没有传
        options.async = true;
    }
    // 代码走到这里,说明async传入了
    // 判断类型是否是布尔值
    if(Object.prototype.toString.call(options.async) !== '[object Boolean]'){
        throw new Error("async参数只接受布尔类型");
    }
    // 处理想要的数据格式 dataType
    // 判断是否传入
    if(!options.dataType){
        options.dataType = 'string';
    }
    // 如果能走到这里,传入了,就判断是否为 string或json
    if(options.dataType.toLowerCase() !== 'string' && options.dataType.toLowerCase() !== 'json'){
        throw new Error("dataType参数只接受string或json");
    }
    // 处理成功时要执行的回调函数
    // 判断是否传入
    if(!options.success){
        options.success = function(){}
    }
    // 如果传入了,判断是否是一个函数
    if(Object.prototype.toString.call(options.success) !== '[object Function]'){
        throw new Error("success参数只接受函数类型");
    }
    // 处理错误是执行的函数
    if(!options.error){
        options.error = function(){}
    }
    // 如果传入了,判断是否是一个函数
    if(Object.prototype.toString.call(options.error) !== '[object Function]'){
        throw new Error("error参数只接受函数类型");
    }
    // 到这里所有参数处理完毕 - 开始ajax
    // ajax对象的兼容写法
    var xhr;
    try{
        xhr = new XMLHttpRequest(); // 这种写法在ie下是不能兼容的
    }catch(e){
        try{
            xhr = new ActiveXObject("Microsoft.XMLHTTP"); // 兼容ie678
        }catch(err){
            xhr = new ActiveXObject("Msxml2.XMLHTTP"); // 更低版本ie
        }
    }
    // 打开
    xhr.open(options.method,options.url,options.async);
    // 监听
    xhr.onreadystatechange = function(){
        // 判断ajax的状态
        // 先判断是否完成
        if(xhr.readyState===4){
            // 在判断是否成功
            if(xhr.status>=200 && xhr.status<300){
                // 成功
                // 获取响应的数据
                var res = xhr.responseText;
                // 判断想要的数据格式是什么
                if(options.dataType==="json"){
                    // 如果是json,就将数据先转为json对象
                    res = JSON.parse(res);
                }
                // 调用成功想执行的函数
                options.success(res);
            }else{ // 请求失败了
                options.error();
            }
        }
    }
    // 发送
    if(options.method==="post"){
        xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");
        xhr.send(data);
        return;
    }
    xhr.send();
}
<!DOCTYPE html>
<head>
<meta charset='utf-8'>
<title>Document</title>
</head>
<body>
<div>
    <span></span>
    <table align="center">
        <caption><h2>登录</h2></caption>
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="button" value="登录"></td>
        </tr>
    </table>
</div>
</body>
<script src="./js/ajax.js"></script>
<script>
var btn = document.querySelector("input[type='button']");
var usernamein = document.querySelector("input[name='username']");
var passwordin = document.querySelector("input[name='password']");
btn.addEventListener("click",login);

function login(){
    var username = usernamein.value.trim();
    var password = passwordin.value.trim();
    // 验证数据
    var usernameRule = /^(\w|[\u4e00-\u9fa5]){2,12}$/;
    var passwordRule = /^[a-zA-Z0-9]{6,16}$/;
    if(!usernameRule.test(username)){
        alert("用户名必须是2~12位的数字、字母、下划线或汉字");
        return false;
    }
    if(!passwordRule.test(password)){
        alert("密码必须是6~16的数字、字母");
        return false;
    }
//调用函数发送ajax
//里面的username是键值对,其实是username:username
    sendAjax({
        url:"login.php",
        method:"post",
        data:{username,password},
        dataType:"json",
        success:res=>{
            if(res.meta.status===201){
                alert(res.meta.msg);
                location.assign("home.html");
            }else{
                alert(res.meta.msg);
                return false;
            }
        }
    });
}

</script>
</html>
 
 

 

/*********************** 这是请求示例 **************************/
/*

sendAjax({
    url:"demo.php",
    method:"post",
    success:function(res){
        console.log(res);
    },
    dataType:"json",
    async:true,
    data:{
        username:"张三",
        sex:"女"
    }
});




sendAjax({method,url,async,data,datatype,success})
*/

这个ajax里面是用一些简单的if判断去对数据进行判断的,然后有需要的朋友可以过来看看哦

之后直接引用这个ajax函数直接写出登录注册功能,因为后台请求数据,我们是用php这个工具进行操作的。所以代码中会出现.php文件;

三、注册页面样式,样式中

<!DOCTYPE html>
<head>
<meta charset='utf-8'>
<title>Document</title>
</head>
<body>
<div>
    <span></span>
    <table align="center">
        <caption><h2>登录</h2></caption>
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="button" value="登录"></td>
        </tr>
    </table>
</div>
</body>
<script src="./js/ajax.js"></script>
<script>
var btn = document.querySelector("input[type='button']");
var usernamein = document.querySelector("input[name='username']");
var passwordin = document.querySelector("input[name='password']");
btn.addEventListener("click",login);

function login(){
    var username = usernamein.value.trim();
    var password = passwordin.value.trim();
    // 验证数据
    var usernameRule = /^(\w|[\u4e00-\u9fa5]){2,12}$/;
    var passwordRule = /^[a-zA-Z0-9]{6,16}$/;
    if(!usernameRule.test(username)){
        alert("用户名必须是2~12位的数字、字母、下划线或汉字");
        return false;
    }
    if(!passwordRule.test(password)){
        alert("密码必须是6~16的数字、字母");
        return false;
    }
//调用函数发送ajax
//里面的username是键值对,其实是username:username
    sendAjax({
        url:"login.php",
        method:"post",
        data:{username,password},
        dataType:"json",
        success:res=>{
            if(res.meta.status===201){
                alert(res.meta.msg);
                location.assign("home.html");
            }else{
                alert(res.meta.msg);
                return false;
            }
        }
    });
}

</script>
</html>

之后注册的php页面代码为:

<?php
header("content-type:text/html;charset=uft8");
//接收数据
$username = $_POST["username"];
$password = $_POST["password"];
$tel = $_POST["tel"];
$email = $_POST["email"];
// var_dump($username,$password,$tel,$email);
//连接数据库
$con = mysqli_connect("localhost","root","root","test");
mysqli_query($con,"set names utf8");
$res = mysqli_query($con,"select * from user where username='$username'");
//提取数据
$row = mysqli_fetch_assoc($res);
if($row){
    // 用户名已经存在
    $arr = [
        "meta"=>[
            "status"=>101,
            "msg"=>"用户名被占用"
        ],
        "data"=>null
    ];
}else{
    $res = mysqli_query($con,"insert user(username,password,tel,email) values('$username','$password',$tel,'$email')");
    if($res){
        // 注册成功
        $arr = [
            "meta"=>[
                "status"=>201,
                "msg"=>"注册成功"
            ],
            "data"=>null
        ];
    }else{
        // 注册失败
        $arr = [
            "meta"=>[
                "status"=>301,
                "msg"=>"注册失败"
            ],
            "data"=>null
        ];
    }
}
echo json_encode($arr);

四、注册成功后,开始了登录页面的样式,登录页面比注册页面结构要少一些,代码如下:

<!DOCTYPE html>
<head>
<meta charset='utf-8'>
<title>Document</title>
</head>
<body>
<div>
    <span></span>
    <table align="center">
        <caption><h2>登录</h2></caption>
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="button" value="登录"></td>
        </tr>
    </table>
</div>
</body>
<script src="./js/ajax.js"></script>
<script>
var btn = document.querySelector("input[type='button']");
var usernamein = document.querySelector("input[name='username']");
var passwordin = document.querySelector("input[name='password']");
btn.addEventListener("click",login);

function login(){
    var username = usernamein.value.trim();
    var password = passwordin.value.trim();
    // 验证数据
    var usernameRule = /^(\w|[\u4e00-\u9fa5]){2,12}$/;
    var passwordRule = /^[a-zA-Z0-9]{6,16}$/;
    if(!usernameRule.test(username)){
        alert("用户名必须是2~12位的数字、字母、下划线或汉字");
        return false;
    }
    if(!passwordRule.test(password)){
        alert("密码必须是6~16的数字、字母");
        return false;
    }
//调用函数发送ajax
//里面的username是键值对,其实是username:username
    sendAjax({
        url:"login.php",
        method:"post",
        data:{username,password},
        dataType:"json",
        success:res=>{
            if(res.meta.status===201){
                alert(res.meta.msg);
                location.assign("index.html");
            }else{
                alert(res.meta.msg);
                return false;
            }
        }
    });
}

</script>
</html>

登录页面的php:

<?php
header("content-type:text/html;charset=utf8");
 
$username = $_POST['username'];
$password = $_POST['password'];
//连接数据库
$con = mysqli_connect("localhost","root","root","test");
mysqli_query($con,"set names utf8");
$res = mysqli_query($con,"select * from user where username='$username'");
//提取数据
$row = mysqli_fetch_assoc($res);
if($row){
//用户名存在
//var_dump($row);
//验证密码
    if($row["password"]===$password){
        $arr = [
            "meta"=>[
                //密码正确时的状态
                "status"=>201,
                "msg"=>"登录成功"
            ],
            "data"=>null
        ];
    }else{
        //登陆失败
        $arr=[
            "meta"=>[
                //密码错误时的状态
                "status"=>301,
                "msg"=>"密码错误"
            ],
            "data"=>null
        ];
    }
}else{
    $arr = [
        "meta"=>[
            //用户名不存在时的状态
            "status"=>101,
            "msg"=>"用户名不存在"
        ],
        "data"=>null
    ];
}
echo json_encode($arr);

最后跳转到index.html的页面,也就是一般网站的首页。这样注册登录功能就完成了。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM