前端基础 -- Ajax快速入门

1、HTTP 状态消息 200 302 304 403 404 500

  • 200:请求已成功,请求所希望的响应头或数据体将随此响应返回
  • 302:请求的资源临时从不同的 URL 响应请求.由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求,只有在Cache-Control 或 Expires 中进行了指定的情况下,这个响应才是可缓存的.
  • 304:如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次一来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码.304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾.
  • 403:服务器已经理解请求,但是拒绝执行它.
  • 404:请求失败,请求所希望得到的资源未被在在服务器上发现.
  • 500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理.一般来说,这个问题都会在服务器端的源代码出现 错误时出现.

2、AJAX
Ajax 的原理简单来说通过 XmlHttpRequest 对象来向服务器发异步请求,可以让网站跟服务器交互的一种技术,能在我们需要时,不用再刷新网页就能去服务器要一些数据回来。

  • 同步:在进行一件事的处理的时候,是从头到尾,中间没有被中断。
  • ​异步:在做一件事件的时候,可以让另一件同时在做。

Ajax的实现步骤

  1. 创建异步对象,XMLHTTPRequest实例(浏览器的内置对象)
  2. 初始化请求对象,post请求需要设置请求头
  3. 监听异步对象的状态变更
  4. 发送请求,根据需求传参
  5. 判断数据获取的成功状态
  6. 成功获取数据,处理渲染数据

get请求

  <script>
        // 1. new一个异步对象  XMLHttpRequest
        var xhr = new XMLHttpRequest();
        // 2. 初始化(设置请求的数据)
        xhr.open('get','http://127.0.0.1:3001/getUserNameAjax'+'?userId=4');
        // var data = 'userId=3'
        // 3. 发生请求
        // xhr.send();
        xhr.send(null);
        // 4. 监听响应
        xhr.onreadystatechange = function() {
            // 5. 判断状态和数据是否传输完成
            if(xhr.status == 200 && xhr.readyState == 4){
                // 服务器响应回来的数据存在:responseText 
                var res = JSON.parse(xhr.responseText);
                console.log(res);
                // 6. 获得响应数据,在浏览器渲染
                var userDom = document.querySelector('#user');
                userDom.innerHTML = '我叫'+res.data.name+',今年'+res.data.age+'岁'
            }          
        }
    </script>

post请求

// 给按钮绑定点击事件
        btn.onclick = function() {
            var userName = userInput.value;
            var userPwd = pwdInput.value;
            // 发送请求,注册用户
            // 1. 创建一个异步对象
            var xhr = new XMLHttpRequest();
            // 2.初始化
            xhr.open('post','http://127.0.0.1:3001/register');
             // 对于post请求一定要设置请求头
            // xhr.setRequestHeader(key value);
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");           
            // 监听响应
            xhr.onreadystatechange = function() {
                // 判断是否完成
                if(xhr.status == 200 && xhr.readyState == 4) {
                    console.log(res);
                    // 获取的数据是一个字符串形式的json数据,需要转换为对象
                    var res = JSON.parse(xhr.responseText);
                    tips.innerHTML = res.msg;
                }
            }
            // 获取数据
            var data = 'userName='+userName+'&userPwd='+userPwd+'';
            // 对于post请求如果有数据必须使用send来发送数据
            xhr.send(data);
        }

3、GET请求和POST请求的异同
相同点:

  1. 创建异步对象
  2. 都需要初始化
  3. 都需要发送数据
  4. 都需要监听发送的状态

不同点:

  1. 请求方式不同
  2. post请求的参数是通过send方法来发送,get请求的参数拼接在url地址栏后面
  3. post请求一定要设置请求头部
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

4、jQuery中的简易的ajax方法

  • get
 $.ajax({
           type: 'get',
           url: 'http://127.0.0.1:3001/validate',
           data: {
                userName: userName
             },
             dataType: 'json',
             success: function (res) {
               // 使用jQuery的ajax方法的时候,返回的JSON数据已经帮我们转换成了对象
              console.log(res);
           }
       });
  • post
  // 给按钮注册点击事件
       btn.onclick = function () {
           $.ajax({
               type: 'post',
               url: 'http://127.0.0.1:3001/register',
               data: {
                   userName: userInput.value,
                   userPwd: pwdInput.value
               },
               dataType: 'json',
               success: function(res){
                //   console.log(res);
                tips.innerHTML = res.msg;
               }
           })
       }

5、请求拦截与超时处理
beforeSend 传入一个函数可以在请求发送之前(相当于原生的 xhr.send 方法之前)进行操作,一般是进行用户输入数据的验证,如果有问题,return false 即可马上停止请求发送。

 btn.onclick = function () {
            $.ajax({
                type: 'post',
                url: 'http://127.0.0.1:3001/register',
                data: {
                    userName: userInput.value,
                    userPwd: pwdInput.value
                },
                dataType: 'json',

                //    jQuery中给我们提供的一个拦截器,当数据在发送之前做拦截,如果判断数据有问题,我们可以不让发送
                beforeSend: function () {

                    if (!userInput.value) {
                        // console.log('亲,请输入用户名哦');
                        tips.innerHTML = '你不要名字的吗?想搞事吗?'
                        return false;
                    }
                },
                 // 设置超时时间   设置一个时间点,只要超过了这个时间点,我们做一个处理,用来提示用户
                timeout: 3000,

                // 如果超时了,给用户一个反馈
                error: function() {
                    tips.innerHTML = "亲,服务器太累了,要休息一下";
                },
                success: function (res) {
                    //   console.log(res);
                    tips.innerHTML = res.msg;
                }
            })
        }

6、表单序列化

  // jQuery中的表单序列化   一次性整体的将整个表单的数据获取过来
  // 特别是当表单中的表单项特别多的时候,使用表单序列化会更加的方便,快捷
            var data1 = $('#form').serialize();

7、模板引擎 art-template

 <!-- 第一步:引入模板引擎文件 -->
    <script src="../assets/js/template.js"></script>
  <!-- 第二步: 准备模板 -->
    <script type="text/html" id="list">
        {{each data}}
            <tr>
                <td>{{$value.id}}</td>
                <td>{{$value.name}}</td>
                <td>{{$value.age}}</td>
                {{if $value.gender == '男'}}
                 <td>小哥哥</td>
                 {{else}}
                 <td>渣女</td>
                {{/if}}
                <td>{{$value.zhuanye}}</td>
                <td>{{$value.address}}</td>
            </tr>
        {{/each}}
    </script>
    <!--第三步渲染-->
     btn.onclick = function() {
            // 点击的时候要发ajax请求获取学生列表数据
            $.get({
                url:'http://127.0.0.1:3001/getStudentsJSON',
                dataType: 'json',
                success: function(res) {
    
                    var htmlStr = template('list',res);
                    // console.log(htmlStr);
                    document.querySelector('#tbody').innerHTML = htmlStr;
                }
            })
        }
  • 拼接字符串
${obj.name}
  • 模板字符串
`<tr>
	<td> ${res.data.id}</td>
	<td> ${res.data.name}</td>
	<td> ${res.data.age}</td>
</tr>
`
  • 原生写法
<script type="text/html" id="list">
        <% for(var index in data) { %>
            <tr>
                <td><%= data[index].id%></td>
                <td><%= data[index].name%></td>
                <td><%= data[index].age%></td>
                <%if(data[index].gender == '男') {%>
                <td>小哥哥</td>
                <% } else{ %>
                <td>小妹妹</td>
                <% } %>
                <td><%= data[index].zhuanye%></td>
                <td><%= data[index].address%></td>
            </tr>
        <% } %>
    </script>

8、逻辑运算符

  • a && b 逻辑与(AND),两个表达式皆为真则为 true,只要一个假,与运算为 false(找假)
  • a || b 逻辑或(OR) , 两个表达式只要一个为真,则或运算为 true (找真)

9、封装AJAX

var $$ = {
    ajax: function (ajaxObj) {
        var type = ajaxObj.type;
        var url = ajaxObj.url;
        var data = ajaxObj.data;
        var dataType = ajaxObj.dataType;
        var success = ajaxObj.success;
        var xhr = new XMLHttpRequest();
        // console.log(this);
        // data = 'userid=2&userxx=1223'
        // 将对象转换为字符串
        data = this.obj2str(data);

        // 做type的大小写兼容,将用户传进来的type值的统一转换为小写   JSON
        type = type.toLowerCase();
        // 将接收返回的数据类型统一转换为小写
        dataType = dataType.toLowerCase();

        // 给一些参数做默认值设置
        type = type || 'get';
        url = url || '';
        data = data || {};
        dataType = dataType || 'json';
        if (type == 'get' && data) {
            url = url + '?' + data;
        }
        xhr.open(type, url);
        if (type == 'post') {
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        }
        xhr.onreadystatechange = function () {
            if (xhr.status == 200 && xhr.readyState == 4) {
                var res;
                if (dataType == 'json') {
                    res = JSON.parse(xhr.responseText);
                } else if (dataType == 'xml') {
                    res = xhr.responseXML;
                } else {
                    res = '你参数的接收数据类型不对,搞事情吗?'
                }
                success(res);
            }

        }
        if (type == 'get') {
            xhr.send(null);
        }
        if (type == 'post') {
            xhr.send(data);
        }
    } 
}

10、FormData
formData对象将表单数据转换为二进制,只能在js上,不能jQuery,不要设置请求头,不要编码

var uploadImg = document.querySelector('#uploadImg');

        // 在这里有一个onchange的方式可以用来处理我们上传
        uploadImg.onchange = function() {
            // console.log(this);
            // console.dir(this);
            var data = new FormData();
            data.append('avatar',this.files[0]);
            // 发送ajax请求
            $.post({
                url: 'http://127.0.0.1:3001/uploadFile',
                dataType: 'json',
                data: data,
                // 因为将数据转换成了二进制所以不需要设置请求头
                contentType: false,
                // 不需要再进行编码
                processData: false,
                success: function (res) {
                    // console.log(res);
                    $('img').attr('src',res.src);
                }
            })
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值