【JavaWeb】Ajax

目录

一、什么是Ajax?

二、同步与异步

三、Ajax工作原理

四、Ajax实现步骤

五、Ajax应用场景

六、Ajax常见问题

1.缓存问题

2.跨域问题

3.请求超时与网络异常

4.取消请求

七、常见Ajax三种请求方式

1.jQuery请求

2.Axios请求

3.Fetch请求

一、什么是Ajax?

Ajax 即 Asynchronous Javascript And XML(异步JavaScript和XML),是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新

二、同步与异步

  1. 同步: 发送一个请求,需要等待响应返回,然后才可以发送下一个请求,如果该请求没有响应,则需等待
  2. 异步:发送一个请求,不需要等待响应返回,随时可以发送下一个请求

三、Ajax工作原理

Ajax的目的是提高用户体验,较少网络数据的传输量。Ajax在客户端和服务器之间加了一个中间层,使客户端操作与服务器响应异步化,一些数据验证和数据处理交给Ajax引擎自己来做,而不需要交给服务器,只有确定需要从服务器读取新数据时才会通过Ajax引擎代为向服务器提交请求

四、Ajax实现步骤

  • 创建XMLHttpRequest核心对象xhr
java 复制代码
const xhr = new XMLHttpRequest();
  • 通过XMLHttpRequest对象的open()方法给当前对象提供访问方式、URL等与服务端建立连接
java 复制代码
xhr.open(method, url, [async][, user][, password])
//method:表示当前的请求方式,常见的有GET、POST
//url:服务端地址
//async:布尔值,表示是否异步执行操作,默认为true
//user: 可选的用户名用于认证用途;默认为null
//password: 可选的密码用于认证用途,默认为null
  • 通过XMLHttpRequest对象的send()方法发送给服务端
java 复制代码
xhr.send([body])
//body: 在 xhr 请求中要发送的数据体,如果不传递数据则为 null 如果使用GET请求发送数据的时候,需要注意如下:
//将请求数据添加到open()方法中的url地址中
//发送请求数据中的send()方法中参数设置为null
  • 接受返回值并处理
java 复制代码
request.onreadystatechange = function(e){
    if(request.readyState === 4){ // 整个请求过程完毕
        if(request.status >= 200 && request.status <= 300){
            console.log(request.responseText) // 服务端返回的结果
        }else if(request.status >=400){
            console.log("错误信息:" + request.status)
        }
    }
}
 
//readyState 属性一共有5个值,分别表示不同的请求响应阶段:
 
//0: 还未创建请求,即未调用 open() 方法
//1: 已调用 open() 方法,但未发送 send() 方法
//2: 已调用 send() 方法,但未接收到响应
//3: 已接收到部分响应
//4: 已接收到全部的响应

五、Ajax应用场景

  • 动态加载内容:Ajax可以在不刷新整个页面的情况下,通过异步请求从服务器获取数据并动态更新页面的部分内容,从而实现更流畅的用户体验

  • 表单验证:Ajax可以在不刷新整个页面的情况下,实时验证表单数据的合法性(如手机号、唯一性校验)并提供反馈信息

  • 搜索建议:当用户在搜索框中输入内容时,Ajax可以在输入框下方实时显示相关的搜索建议,帮助用户更快速地找到自己需要的信息

  • 购物车更新:Ajax可以在不刷新整个页面的情况下,实时更新购物车中的商品数量以及总价等信息

  • 实时聊天:Ajax可以实现与服务器的实时通信,让用户在不刷新页面的情况下,实时接收到其他用户的消息(如直播评论、点赞、礼物等)

六、Ajax常见问题

1.缓存问题

在一些浏览器中存在缓存机制,Ajax只会发送一次请求,剩余请求则不会再发送给浏览器,而是直接读取缓存中的数据

解决方案:浏览器缓存是通过URL地址记录,只需更改URL地址即可解决缓存问题,xhr.open("get","/demo?t="+Date.now())

2.跨域问题

当一个页面向另一个不同域名/不同协议/不同端口的页面请求资源时,因为浏览器的同源策略,会产生跨域问题

解决方案:

  1. 后台Http请求转发
  2. 后台配置Cors
  3. 使用SpringCloud网关
  4. 使用Nginx转发

3.请求超时与网络异常

当请求时间过长或网络出现问题时,可单独做一些特殊处理

javascript 复制代码
btn.addEventListener('click', function(){
            const xhr = new XMLHttpRequest();
            //超时时间设置为2s
            xhr.timeout = 2000;
            //超时处理
            xhr.ontimeout = function(){
                // 超时相关操作
            }
            //网络异常处理
            xhr.onerror = function(){
                // 网络异常相关操作
            }

            xhr.open("GET",'http://127.0.0.1:8080/demo');
            xhr.send();
            xhr.onreadystatechange = function(){
                if(xhr.readyState === 4){
                    if(xhr.status >= 200 && xhr.status< 300){
                        result.innerHTML = xhr.response;
                    }
                }
            }
        })

4.取消请求

当请求发出但并未响应时,可通过abort()取消请求

javascript 复制代码
const btns = document.querySelectorAll('button');
        let x = null;
        btns[0].onclick = function(){
            x = new XMLHttpRequest();
            x.open("GET",'http://127.0.0.1:8080/demo');
            x.send();
        }
        // 取消请求
        btns[1].onclick = function(){
            x.abort();
        }

七、常见Ajax三种请求方式

1.jQuery请求

jQuery是⼀个优秀的js框架,对JS原⽣的Ajax进⾏了封装,封装后的Ajax的操作⽅法更简洁,功能更强⼤,jQuery三种常见请求方式:

|--------|--------------------------------------------|
| 请求方式 | 语法 |
| Ajax请求 | .ajax(\[settings\]) | | GET请求 | .get(url,[data],[callback],[type]) |
| POST请求 | $.post(url,[data],[callback],[type]) |

|----------|--------------------------------|
| 参数名称 | 描述 |
| url | 请求地址 |
| data | 请求参数 |
| type | 请求类型 |
| async | 布尔类型true/false,代表异步和同步,默认为true |
| dataType | 回传数据类型 |
| success | 成功回调函数 |
| error | 失败回调函数 |

javascript 复制代码
// Ajax请求
$.ajax({
     url:"",
     data:{},
     type:"post/get",
     async:true,
     dataType:"text",
     success:function(obj){
     },
     error:function(){
     }
})
javascript 复制代码
// GET请求
$("button").click(function(){
  $.get("demo_test.asp",function(data,status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});
javascript 复制代码
// POST请求
$("button").click(function(){
  $.post("demo_test_post.asp",
  {
    name:"Donald Duck",
    city:"Duckburg"
  },
  function(data,status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});

2.Axios请求

javascript 复制代码
    //配置 baseURL
    axios.defaults.baseURL = 'http://127.0.0.1:8080';
    btns[2].onclick = function () {
      axios({
        //请求方法
        method: 'POST',
        //url
        url: '/axios-server',
        //url参数
        params: {
          vip: 10,
          level: 30
        },
        //头信息,此部分如果使用自定义的头信息,需要服务端进行相应修改,正常不设置
        headers: {
          a: 100,
          b: 200
        },
        //请求体参数
        data: {
          username: 'admin',
          password: 'admin'
        }
      }).then(response => {
        //响应状态码
        console.log(response.status);
        //响应状态字符串
        console.log(response.statusText);
        //响应头信息
        console.log(response.headers);
        //响应体
        console.log(response.data);
      })
    }

3.Fetch请求

javascript 复制代码
btn.onclick = function () {
      fetch('http://127.0.0.1:8080/fetch-server?vip=10', {
        //请求方法
        method: 'POST',
        //请求头
        headers: {
          name: 'aodi'
        },
        //请求体
        body: 'username=admin&password=admin'
      }).then(response => {
        // return response.text();
        return response.json();
      }).then(response => {
        console.log(response);
      });
    }
相关推荐
庸俗今天不摸鱼12 分钟前
【万字总结】前端全方位性能优化指南(十)——自适应优化系统、遗传算法调参、Service Worker智能降级方案
前端·性能优化·webassembly
QTX1873012 分钟前
JavaScript 中的原型链与继承
开发语言·javascript·原型模式
黄毛火烧雪下19 分钟前
React Context API 用于在组件树中共享全局状态
前端·javascript·react.js
Apifox29 分钟前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
一张假钞32 分钟前
Firefox默认在新标签页打开收藏栏链接
前端·firefox
高达可以过山车不行32 分钟前
Firefox账号同步书签不一致(火狐浏览器书签同步不一致)
前端·firefox
m0_5937581033 分钟前
firefox 136.0.4版本离线安装MarkDown插件
前端·firefox
掘金一周36 分钟前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端
三翼鸟数字化技术团队1 小时前
Vue自定义指令最佳实践教程
前端·vue.js
Jasmin Tin Wei1 小时前
蓝桥杯 web 学海无涯(axios、ecahrts)版本二
前端·蓝桥杯