JavaScript之Ajax(一篇入门Ajax就够了)

news2024/11/20 1:52:18

一、概念

1.什么是Ajax

Ajax(Asynchronous Javascript And XML),即是异步的JavaScript和XML,Ajax其实就是浏览器与服务器之间的一种异步通信方式

异步的JavaScript

它可以异步地向服务器发送请求,在等待响应的过程中,不会阻塞当前页面,在这种情况下,浏览器可以做自己的事情。直到成功获取响应后,浏览器才开始处理响应数据。

XML

是前后端数据通信时传输数据的一种格式,现在已经不怎么用了,现在比较常用的是 JSON

所以归纳上述的概念,Ajax就是在浏览器不重新加载网页的情况下,对页面的某部分进行更新。

2.应用场景

注册页面

搜索提示

还有很多很多...

所以Ajax最大的优点就是,发送请求的时候不会影响用户的操作,相当于两条平行线一样,“你忙你的,我忙我的”,不需要去等待页面的跳转而浪费时间。


二、实现Ajax

我们先看一组代码:在这里创建的json文件和html文件都在同一个文件夹中

//test.josn的代码
{
    "reply":"我收到啦!"
}

const xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
   if (xhr.readyState !== 4) return;
   if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
       console.log(xhr.responseText);
    }
};
xhr.open('GET', 'text.json', true);
xhr.send(null);

执行结果:

在这里要啰嗦两句:json文件中的对象键名一定要用双引号包裹,如果属性值里面有字符串,也需要用双引号包裹

执行步骤

1.创建xhr对象

const xhr = new XMLHttpRequest();

2.利用onreadystatechange属性,封装一个函数,用于监听 readyState的变化。

xhr.onreadystatechange = () => {
if (xhr.readyState !== 4) return;
if (xhr.status >= 200 && xhr.status < 300 ){
    console.log(xhr.responseText);
    }
};

2.1在xhr对象执行收发数据的时候,它会经历五种状态:

Ajax状态码状态
0未初始化)未启动
1启动)已经调用 open(),但尚未调用 send()
2发送)发送状态,已经调用 send(),但尚未接收到响应
3接收)已经接收到部分响应数据
4完成)已经接收到全部响应数据,而且已经可以在浏览器中使用了

加两句console.log()就可以看见状态码的变化了。

上述的readyStateChange事件是专门用来监听xhr对象的Ajax状态码,只要readyState(也就是Ajax状态码)发生了变化,就会触发这个事件。

2.2判断HTTP状态码是否为200-299

Ajax状态码为4是不够的,这仅仅表明收到服务器端响应的全部数据,并不能保障数据都是正确的。

所以,我们还需要判断HTTP的状态码,判断xhr对象的status属性值是否在200到300之间(200-299 用于表示请求成功)

if (xhr.status >= 200 && xhr.status < 300 ){
    console.log(xhr.responseText);
}

所以要想请求成功完成,必须要满足上面两个条件。

3.准备发送请求

xhr.open('GET','text.json', true);

参数1:选用"GET"或者“POST”的请求方式

参数2:发送请求的地址

参数3:是否异步

4.发送请求

xhr.send(null)

 注意:send() 的参数是通过请求体携带的数据,而GET请求是通过请求头携带数据的,所以要把send的参数置为null


三、跨域

概念

什么是跨域?为什么会有跨域这种问题存在?

跨域的字面意思来说,就是向一个域发送请求,如果要请求的域和当前域是不同域,就叫跨域

https(协议)://a.xxx.com(域名):8080(端口号)/flie/list(路径)

只要协议、域名、端口号,只要有任何一个不一样,都是不同域

同源策略

同源策略限制了跨域,同源策略是浏览器核心的安全机制,如果没有了同源策略,浏览器的正常功能就会受到影响,所以web是构建在同源策略的基础之上。

如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。

以下就是不同源:

前端: http://a.com:8080/

服务端:https//b.com/api/xxx

所以同源就是协议、域名、 端口号都要一样。

跨域解决方法

1.CORS 跨域资源共享

2.JSONP

感兴趣的同学可以去查阅一下这两个解决方法,因为需要后端API的支持,所以这里就不给大家演示了。


四、写一个简易的Ajax

这个代码结合了Promise和Ajax的知识点,如果有小伙伴对Promise不熟悉的,可以点这里:

JavaScript异步(必考三座大三之三)——第三集:Promise_精通各种hello world的小希的博客-CSDN博客_js异步加载的方式

function ajax(url) {
      const p = new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('GET', url, true)
        xhr.onreadystatechange = () => {
          if(xhr.readyState === 4){
            if((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304){
              resolve(
                JSON.parse(xhr.response)
              )
            }else{
              reject(new Error('Response error'))
            }
          }
        }
        xhr.send(null)
      })
     return p
}
const url = 'text.json'
ajax(url).then(res => console.log(res)).catch(err => console.log(err))

小结

我们再记住一遍Ajax的执行步骤,一定要记住哦!

1.创建一个xhr对象

2.使用xhr的readystatechange属性,判断Ajax的状态码

3.判断HTTP的状态码

4.xhr.open()准备发送请求

5.xhr.send()发送请求

今天你学废了吗?

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 + vite中开发环境和生产环境全局变量配置

目录一、开发环境和生产环境二、配置环境变量三、使用全局变量一、开发环境和生产环境 开发环境&#xff1a;也就是编码时运行的环境&#xff0c;即我们使用npm run dev或者npm run serve运行项目到本地时&#xff0c;项目处于的环境。 生产环境&#xff1a;项目部署到服务器…

07. vue3+vite+qiankun搭建微应用前端框架,并接入vue3微应用

目录前言主应用微应用部署前言 因为业务系统接入的需要&#xff0c;决定将一个vue3vitets的主应用系统&#xff0c;改造成基于qiankun的微应用架构。此文记录了改造的过程及vue3微应用接入的种种问题。 网上有很多关于微应用改造的案例&#xff0c;但很多都没写部署之后什么情…

web前端文件上传可选择的4种方式

在web前端开发中&#xff0c;文件上传属于很常见的功能&#xff0c;不论是图片、还是文档等等资源&#xff0c;或多或少会有上传的需求。一般都是从添加文件开始&#xff0c;然后读取文件信息&#xff0c;再通过一定的方式将文件上传到服务器上&#xff0c;以供后续展示或下载使…

WEB核心【记录网站登录人数,记录用户名案例】Cookie技术实现

目录 &#x1f482; 个人主页: 爱吃豆的土豆&#x1f91f; 版权: 本文由【爱吃豆的土豆】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 &#x1f3c6;人必有所执&#xff0c;方能有所成&#xff01; &…

npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree

当我们拿到一个前端项目的时候&#xff0c;想要把它运行起来&#xff0c;首先是要给它安装依赖&#xff0c;即cd到当前项目根目录下去执行npm install命令&#xff0c;然后有一定几率在终端你会遇到这样的报错&#xff1a; npm ERR! code ERESOLVEnpm ERR! ERESOLVE unable to…

HTML基础————table标签

1.什么是table&#xff1f; table是html中的表格&#xff0c;由tr、td、th元素组成。 tr 元素定义表格行&#xff0c;th 元素定义表头&#xff0c;td 元素定义表格单元 2.可选的属性 属性描述border定义表格的边框cellpadding单元格内内容与单元格边的间距cellspacing单元格…

Vite配置环境变量

Vite配置代码环境变量和 Vue2 的配置差不多&#xff0c;都是依靠 .env 文件夹来实现 详情可到 Vite 官网的环境配置里了解&#xff1a;环境变量和模式 {#env-variables-and-modes} | Vite中文网 一、在src同级下创建 .env.production 生产模式和 .env.development 开发模式两…

基于 vue3 element-plus 的暗黑模式

前言 element-plus2.2.0 已经开始支持暗黑模式了 通过在html标签上添加一个名为 dark 的类来启用 基于 vue3 & element-plus 的项目现在可以方便的添加暗黑模式 一、基本使用 因为是通过在html标签上添加 dark 类&#xff0c;可以自行实现切换 但为了方便切换以及进一…

WEB核心【会话技术】第十五章

目录 &#x1f482; 个人主页: 爱吃豆的土豆&#x1f91f; 版权: 本文由【爱吃豆的土豆】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 &#x1f3c6;人必有所执&#xff0c;方能有所成&#xff01; &…

【JavaScript】VUE前端实现微信版录制音频wav格式转化成mp3格式和Base64

一、前言 前端有个需求是要实现一个像微信一样&#xff0c;按住录音&#xff0c;松开发送语音&#xff0c;期间踩了不少坑&#xff0c;特地记录一下&#xff0c;主要用到两个库 js-audio-recorder &#xff1a;负责录制音频&#xff0c;支持的格式只有wav、pcmLAMPjs &#x…

三更Blog项目总结(p1~p40)

文章目录项目创建——多模块开发功能业务逻辑总结热门文章列表分类列表分页文章查询文章详情友链查询登录功能退出登录视频地址&#xff1a;SpringBoot项目实战-前后端分离博客项目-Java项目_哔哩哔哩_bilibili 项目创建——多模块开发 整个系统分为前台模块&#xff08;blog&…

三步解决微信小程序cdn加速(资源大小超过200k)

刚开始开发小程序的时候&#xff0c;上传代码会遇到这样的问题&#xff1a;图片和音频资源大小超过 200 K 下面是官方建议 【建议】小程序代码包里可以存放一些必要的静态资源&#xff08;例如tabbar的icon等&#xff09;&#xff0c;不过静态资源体积过大也会影响小程序代码…

运行安装vue3+vite+Ts项目报错,无法加载vite.config.ts文件(failed to load config from D:\XXX\vite.config.ts)

git 上面拉别人的vue3viteTs项目&#xff0c; 安装依赖成功之后运行&#xff0c;出现报错 failed to load config from D:\XXX\vite.config.ts 百度搜索的结果是用 pnpm进行下载 然后卸载node_modules文件进行重新下载&#xff0c;这时候有出现问题 自己的node版本太低。如…

【Node.js+koa--后端管理系统】设计动态发布、修改、查询、删除接口

&#x1f373;作者&#xff1a;贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 &#xff0c;一名很普通但不想普通的程序媛}贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛&#x1f933; &#x1f64a;语录&#xff1a;多一些不为什么的…

级联选择器(el-cascader)动态加载(lazyLoad)实现省市区三级选择

开开心心工作&#xff0c;兢兢业业生活 一、实现省市区级联选择&#xff08;插件&#xff09; 1. 需求&#xff1a;实现一个省市区的级联选择器&#xff0c;点击一级&#xff0c;动态加载下一级 那好&#xff0c;我们找个轮子 2. 他山之石&#xff08;找个轮子&#xff09; E…

Eclipse配置Tomcat详细教程,其中包含如何使用eclipse+tomcat创建并运行web项目

一&#xff1a;Tomcat的下载官网:Apache Tomcat - Welcome!https://tomcat.apache.org/ 进入官网显示如图所示的界面&#xff0c;在下下载的是Tomcat9.0版本&#xff0c;你可以自己选一款。 点击然后进入下面这个界面&#xff1a; 在下电脑是64位&#xff0c;所以 在下下载的6…

【vue】仿PC端微信制作聊天框

前言 采用(vuevue-routervuexes6stylus) 来实现一个仿PC端微信的小demo&#xff0c;可以使用一个智能api&#xff0c;实现智能对话。欢迎大家对鄙人提出宝贵意见&#xff0c;相互学习讨论&#xff0c;一起进步。 demo地址 源码地址 demo做的是PC版&#xff0c;建议使用电脑预…

我的VUE 学习之路(下)

前言&#xff1a; 在经历过前面在HTML下的VUE相关基础的洗礼后&#xff0c;我们可以动手去做一些事了&#xff0c;此时发现直接通过直接VUE组件方式与之前在HTML不同&#xff0c;首先要“静一静”&#xff0c;细看之下只是对之前的很多写法做了封装。 本文旨在直接上手Vue项目下…

FormData详解

FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式&#xff0c;并且可以轻松的将数据通过XMLHttpRequest.send() 方法发送出去&#xff0c;本接口和此方法都相当简单直接。如果表单 enctype 属性设为 multipart/form-data &#xff0c;则会使用表单的 submit(…

vue项目控制台报错信息问题记录:Uncaught TypeError: Cannot read properties of null (reading ‘setAttribute‘)

在写vue项目的时候&#xff0c;控制台总是报错如下代码&#xff1a; 1、Uncaught TypeError: Cannot read properties of null (reading ‘setAttribute‘) 主要是因为某些代码书写不规范&#xff0c;导致templete解析不出来&#xff0c;从而报错 解决方案&#xff1a; 检查下…