• Ajax运行原理及实现


    Ajax运行原理及实现

    Ajax应用场景

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

    Ajax实现步骤

    //创建ajax对象
    var xhr = new XMLHttpRequest();
    //告诉ajax要向哪发送请求,以什么方式发送
    //1)请求方式 2)请求地址
    xhr.open('get','http://localhost:3000/first');
    //发送请求
    xhr.send();
    //获取服务器端响应到客户端的数据
    xhr.onload = function(){
        console.log(xhr.responseText);
    }
    

    服务器端响应的数据格式

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

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

    JSON.parse()	//将json字符串转换为json对象
    

    请求参数传递

    • GET请求方式
    xhr.open('get', 'http://www.example.com?name=zs&password=123');
    
    • POST请求方式
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
    xhr.send('name=zs&password=123')
    

    请求参数的格式

    1. application/x-www-form-urlencoded
    name=zs&age=18&sex=男
    

    2.application/json

    {name:'zs', age:'18', sex:'男'}
    

    在请求头中指定Content-Type属性的值是application/json,告诉服务器当前请求参数的格式是json。

    JSON.stringify()//将json对象转换为json字符串
    

    获取服务器端的响应

    Ajax状态码

    在创建ajax对象,配置ajax对象,发送请求,以及接受完服务器端响应数据,这个过程中的每一个步骤都会对应一个数值,这个数值就是ajax状态码

    0:请求未初始化(还没有调用open())

    1:请求已经建立,但是还没有发送(还没有调用send())

    2:请求已经发送

    3:请求正在处理中,通常响应中已经有部分数据可以用了

    4:响应已经完成,可以获取并使用服务器的响应了

    xhr.readyState	//获取Ajax状态码
    
    onreadystatechange事件
    两种获取服务器端响应方式的区别
    区别描述 onload事件 onreadystatechange事件
    是否兼容IE低版本 不兼容 兼容
    是否需要判断Ajax状态码 不需要 需要
    被调用次数 一次 多次

    Ajax错误处理

    1. 网络畅通,服务器能接收到请求,服务器返回的结果不是预期结果

    可以判断服务器端返回的状态码,分别进行处理。xhr.status获取http状态码

    1. 网络畅通,服务器端没有接收到请求,返回404状态码

    检查请求地址是否错误

    1. 网络畅通,服务器端能接收到请求,服务器端返回500状态码

    服务器端错误,找后端程序员进行沟通

    1. 网络中断,请求无法发送到服务器端

    会触发xhr对象下面的onerror事件,在onerror事件处理函数中对错误进行处理

    Ajax状态码与http状态码的区别

    Ajax状态码:表示Ajax请求的过程状态,ajax对象返回的

    http状态码:表示请求的处理结果,是服务器端返回的

    低版本IE浏览器的缓存问题

    问题:在低版本的IE浏览器中,Ajax请求有严重的缓存问题,即在请求地址不发生变化的情况下,只有第一次请求会真正发送到服务器端,后续的请求都会从浏览器的缓存中获取结果。及时服务器端的数据更新了,客户端依然拿到的是缓存中的旧数据。

    解决方案:在请求地址的后面加请求参数,保证每一次请求中的请求参数的值不相同。

    xhr.open('get', 'http://www.example.com?t='+Math.random());
    
  • 相关阅读:
    死磕Lambda表达式(四):常用的函数式接口
    死磕Lambda表达式(三):更简洁的Lambda
    死磕Lambda表达式(二):Lambda的使用
    死磕Lambda表达式(一):初识Lambda
    二叉树面试题:前中序求后序、中后序求前序
    五分钟后,你将真正理解MySQL事务隔离级别!
    详细解析Redis中的布隆过滤器及其应用
    详细解析Java虚拟机的栈帧结构
    面试真题:求100万内的质数
    C#-Xamarin的Android项目开发(一)——创建项目
  • 原文地址:https://www.cnblogs.com/actorhuang/p/14103284.html
Copyright © 2020-2023  润新知