Ajax学习笔记

Ajax

它是浏览器提供的一套方法,可以实现页面无刷新更新数据(即实现在用户浏览网页的过程中,局部更新页面中的数据),提高用户浏览网站应用的体验。
注意:ajax技术需要运行在网站环境中生效,要能以localhost域名的方式打开页面。

Ajax应用场景

1.页面上拉加载更多数据
2.列表数据无刷新分页
3.表单项离开焦点数据验证
4.搜索框提示文字下拉列表

Ajax运行原理及实现

Ajax 相当于浏览器发送请求与接收响应的代理人,由Ajax帮助浏览器发送请求、接收服务器端响应到客户端的数据,当它接收到响应的数据,再使用dom方法将服务器端发送的数据内容添加到页面中,以实现边浏览页面边刷新数据,从而提高用户体验。

1.Ajax入门

//app.js
app.get('/first', (req, res) => {
    res.send('hello ajax');
});

//html文件的<script>标签中
        //1.创建ajax对象
        var xhr = new XMLHttpRequest();
        //2.告诉ajax对象向哪、以什么方式发送请求
        //open(请求方式,请求地址)
        xhr.open('get', 'http://localhost:8888/first');
        //3.发送请求
        xhr.send();
        //4.获取服务器端响应到客户端的数据
        //请求响应时间不确定,因此无法在send后直接拿到数据
        //此处用onload监听xhr事件
        xhr.onload = function() {
            //xhr.responseText保存服务器端返回给客户的数据
            console.log(xhr.responseText);
        }

2.服务器端响应的数据类型

实际开发中,服务器端大多数情况下会以 JSON 对象作为响应数据的格式。当客户端拿到响应数据时,要将 JSON 数据和 HTML 字符串进行拼接,然后将拼接的结果展示在页面中。

但是在 http 请求与响应的过程中,无论是请求参数还是响应内容,如果是对象类型,最终都会被转换为对象字符串进行传输。

因此我们最后需要对返回的数据使用JSON.parse()将 json 字符串转换为json对象。

Ajax错误处理

  1. 网络畅通,服务器端能接收到请求,服务器端返回的结果不是预期结果。
    可以判断服务器端返回的状态码,分别进行处理。xhr.status 获取http状态码

  2. 网络畅通,服务器端没有接收到请求,返回404状态码。
    检查请求地址是否错误。

  3. 网络畅通,服务器端能接收到请求,服务器端返回500状态码。
    服务器端错误,找后端程序员进行沟通。

  4. 网络中断,请求无法发送到服务器端。
    会触发xhr对象下面的onerror事件,在onerror事件处理函数中对错误进行处理。

封装ajax函数

1.将重复执行的代码封装:
(1)创建ajax对象
(2)配置ajax对象
(3)发送请求
(4)监听xhr对象下的onload事件,需要对http状态码进行判断,需要对响应数据类型进行判断

2.请求参数
(1)请求参数的位置:将请求参数传递到ajax函数内部,在函数内部根据请求方式的不同将请求参数放置在不同的位置(get放在请求地址的后面,post放在send方法中)
(2)请求参数传递的格式:用户传递json格式的数据更为方便,在ajax内部再进行字符串拼接以及转换处理
(3)根据请求参数类型响应对应数据格式

3.设置在调用ajax函数时部分参数的默认值

//ajax函数封装
function ajax(options) {
    //存储默认值
    var defaults = {
        type: 'get',
        url: '',
        data: {},
        header: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        success: function() {},
        error: function() {}
    }

    //对象覆盖,会影响原对象
    Object.assign(defaults, options);
    //1.创建ajax对象
    var xhr = new XMLHttpRequest();

    //拼接请求参数的变量
    var params = '';
    for (var attr in defaults.data) {
        params += attr + "=" + defaults.data[attr] + '&';
    }
    //截取参数最后的&符
    params = params.substr(0, params.length - 1);

    //判断请求参数,如果请求方式是get
    if (defaults.type == 'get') {
        defaults.url = defaults.url + '?' + params;
    }

    //2.配置ajax对象(请求方式、请求地址开始无法确定)
    xhr.open(defaults.type, defaults.url);

    //3.发送请求
    //判断请求参数,如果请求方式是post
    if (defaults.type == 'post') {
        //用户希望向服务器端传递的请求参数类型
        var contentType = defaults.header['Content-Type'];
        //设置请求参数格式的类型
        xhr.setRequestHeader('Content-Type', contentType);
        //判断用户希望向服务器端传递的请求参数类型
        if (contentType == 'application/json') {
            //向服务器端传递json格式参数
            xhr.send(JSON.stringify(defaults.data));
        } else {
            //向服务器端传递普通类型请求参数
            xhr.send(params);
        }
    } else {
        xhr.send();
    }

    //4.监听xhr对象下的onload事件
    //当xhr对象接收完响应数据后触发
    xhr.onload = function() {
        //获取响应头中的数据类型
        var dataType = xhr.getResponseHeader('Content-Type');
        //服务器端返回的数据
        var responseText = xhr.responseText;

        //如果响应类型包含json
        if (dataType.includes('application/json')) {
            //字符串转换成json格式对象
            responseText = JSON.parse(responseText);
        }

        if (xhr.status == 200) {
            //请求成功
            defaults.success(responseText, xhr);
        } else {
            //请求失败
            //xhr.responseText此时传递错误信息
            defaults.error(responseText, xhr);
        }
    }
}

//ajax函数使用
ajax({
    type: 'get', //请求方式
    url: 'http://localhost:8888/responseData', //请求地址
    data: {
        name: 'zhangsan',
        age: 20
    },
    header: {
        'Content-Type': 'application/json'
    },
    success: function(data) {
        console.log('success函数');
        console.log(data);
    },
    error: function(data, xhr) {
        console.log('这里是error函数' + data);
        console.log(xhr);
    }
});
上一篇:Windows下启动Jmeter出现Not able to find Java executable or version问题解决方案


下一篇:xml初识-js