嘘~ 加载慢,正在从阿水的辣鸡服务器里偷取页面 . . .

JavaScript-Ajax


JavaScript学习笔记

AJAX

1、传统方法请求服务器

传统的web交互是用户触发一个http请求服务,服务器收到之后做出响应,并且返回一个新的的页面,每当服务器处理客户端提交的请求时,客户端处于空闲等待。并且哪怕只是与服务端进行一个简单的交互或请求一个简单的数据,都要返回一个完整的HTML页面,这造成了大量的带宽浪费,以及应用响应非常慢。

2、什么是AJAX

AJAX即“Asynchronous JavaScript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术,用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,是网页实现异步更新,意味着可以不重新加载网页而对网页的部分进行更新。

异步:浏览器在请求数据的过程中,不会一直等待,这段时间还可以做其他的操作。

同步:浏览器在请求数据的的过程中,会一直等待事件的响应,直到返回结果才会执行其他的操作。

尽管X在AJAX中代表XML,但是由于JSON的许多优势,比如更加轻量以及作为JavaScript的一部分,目前JSON比XML更加普遍。JSON和XML都被用于在ajax模型中打包信息。

3、ajax的使用步骤

  • 创建XMLHTTPRequest对象

    var ajax = new XMLHttpRequest();
  • 使用open()方法设置和服务器的交互信息

open()有三个参数:请求类型、url、受否异步(布尔类型)。

请求类型又简单分为两种:get、post。get方式通过将数据放在url地址中传到服务器。post方式通过send()方法传送数据,因此相对安全。

url为向服务端请求数据的地址,get方法传输时,发送到服务端的数据放在url中以?与前面的地址分隔。而post方法则不用。

第三个参数为Boolean类型,决定请求方式是否为异步,true为异步方式。

  • 设置发送的数据,开始和服务端交互

    通过send()方法向服务端发送数据,通过post类型传输时,将数据以参数形式传通过send方法发送数据。

  • 注册事件

    ajax.onreadystatechange = function(){//通过onreadystatechange事件监听前后台数据交互阶段
        if(ajax.readyState === 4){//判断ajax的状态,当为4的时候代表ajax请求成功。
            if(ajax.statuus === 2){//判断服务器的状态,200表示请求成功。
                console.log(ajax.responseText);//通过ajax.responseText获取返回的数据
            }
        }
    }

    readyState属性可以获取ajax的状态,由0-4表示,分别表示如下:

    • 0:(初始化)还没调用open方法
    • 1:(载入)已调用send()方法,正在发送请求
    • 2:(载入完成)send()方法完成,已收到全部响应内容
    • 3:(解析)正在解析响应内容
    • 4:(完成)响应内容解析完成,可以在客户端调用了

    status属性可以获取服务器返回的网络状态码,一共5个系列:

    • 1xx系列:消息,指定客户端响应的某些动作这一类状态码代表请求已被接受,需要继续处理,这类响应是临时响应,只包含状态行和某些可选的响应头信息,以空行结束。由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些实验条件下,服务器禁止向此类客户端发送响应。
    • 2xx系列:成功,代表请求已经成功被服务器接收、理解并接受。常见的有200、201。
    • 3xx系列:重定向,代表需要客户端采取进一步的操作才能完成请求,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的location中指明。
    • 4xx系列:请求错误,代表客户端看起来可能发生了错误,妨碍了服务器处理。如401、404。
    • 5xx系列:服务器错误,代表服务器在处理请求的过程中有错误或异常状态发生,也有可能是服务器意识到当前的软硬件资源无法完成对请求的处理。

3-1、get方式请求

var ajax = new XMLHttpRequest();
ajax.open('get','./data/data.json?username=张三&&age=18',true);//get方式数据通过url发送到服务端
ajax.send();
ajax.onreadystatechange = function(){
    if(ajax.readyState === 4){
        if(ajax.status === 200){
            console.log(ajax.responseText);
        }
    }
}

3-2、post方式请求

var ajax = new XMLHttpRequest();
ajax.open('post','./data/data.json',true);
ajax.setRequestHeader('content-type','application/x-www-form-urlencoded');//post方式需要设置请求头(第二个参数是form表单enctype属性的一个值)
ajax.send('username=张三&&age=18');//post方式数据通过send()方法发送到服务端
ajax.onreadystatechange = function(){
    if(ajax.readyState === 4){
        if(ajax.status === 200){
            console.log(ajax.responseText);
        }
    }
}

4、封装ajax请求

//method:请求类型
//url:请求地址
//data:传输到服务端的数据
//callback:回调函数
function ajax(method, url, data, callback) {
    var ajax = new XMLHttpRequest(); //创建ajax对象
    if (method.toLowerCase() === 'get') { //get方法
        if (data) { //判断数据是否为空
            url += '?' + data; //将数据加到url后面
        }
        ajax.open(method, url, true); //设置请求信息
        ajax.send(); //发送数据
    } else if (method.toLowerCase() === 'post') { //post方法
        ajax.open(method, url, true);
        ajax.setRequestHeader('content-type', 'application/x-www-form-urlencoded'); //设置post方法设置请求头
        ajax.send(data);
    }
    ajax.onreadystatechange = function () {
        if (ajax.readyState === 4) { //判断ajax状态
            if (ajax.status === 200) { //判断服务器状态
                callback && callback(ajax.responseText); //将数据放入回调函数
            } else {
                throw new Error('请求失败,错误码为:' + ajax.status); //请求失败则抛出错误
            }
        }
    }
}

5、数据解析

JSON的常规用途是同web服务器进行数据传输,在从web服务器接收数据时,数据永远是字符串形式,需要转成数组或对象形式来使用,一般用JSON.parse()方法。

JSON.parse()方法将一个JSON字符串转换为对象,对于衍生自数组的JSON使用JSON.prase(),则会返回JavaScript数组,而不是对象。

对象形式的json数据

{
    "jData":[
        {
            "username": "张三",
            "age":18
        },
        {
            "username":"李四",
            "age":20
        }
    ]
}
<script src="./js/ajax.js"></script> //调用前面封装好的ajax
<script>
    ajax('get', './data/data.json', 'name=ajax&&method=get', function (response) {
    console.log(JSON.parse(response) instanceof Object);//true
});
</script>
//instanceof用于测试左边的对象是否是右边对象的实例

数组形式的json数据

[
    {
        "username": "张三",
        "age":18
    },
    {
        "username":"李四",
        "age":20
    }
]
<script src="./js/ajax.js"></script> //调用前面封装好的ajax
<script>
    ajax('get', './data/data.json', 'name=ajax&&method=get', function (response) {
    console.log(JSON.parse(response) instanceof Array);//true
});
</script>

eval()方法也能将字符串数组转成真正的数组,但是该函数官方说明为 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。该方法的用途并不是用来将字符串转数组,不推荐在这使用。

eval("x=10;y=20;document.write(x*y)"); //200
console.log(eval("2+2")); //4
var x = 10
console.log(eval(x + 17)); //27
var str = '[1,2,3]';
console.log(eval(str),eval(str) instanceof Array);//(3)&nbsp;[1, 2, 3]  true

虽然该函数功能强大,但也不经常使用。

ajax请求数据实例

<script src="./js/ajax.js"></script> //调用前面封装好的ajax
var ul = document.getElementsByTagName('ul')[0];//获取ul
ajax('post','./data/data.json','',addLi);//ajax请求json中的数据
function addLi(data){
    var d = JSON.parse(data);//json数据转成数组形式,原json数据为衍生数组的json,可以直接用JSON.parse()转成数组类型
    d.forEach(function(item){
        ul.innerHTML += `<li>${item.username}</li>`;//将数据在页面中渲染
    })
}

文章作者: 百念成诗
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 百念成诗 !
评论
  目录