web前端JavaScript之Ajax(一篇入门Ajax就够了)
小职 2021-12-28 来源 : 阅读 1326 评论 0

摘要:本篇主要介绍了web前端JavaScript之Ajax(一篇入门Ajax就够了),通过具体的内容展现,希望对大家web前端JavaScript Ajax的学习有一定的帮助。

本篇主要介绍了web前端JavaScript之Ajax(一篇入门Ajax就够了),通过具体的内容展现,希望对大家web前端JavaScript Ajax的学习有一定的帮助。

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

一、概念

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);

执行结果:

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



在这里要啰嗦两句: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对象执行收发数据的时候,它会经历五种状态:

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


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

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


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


web前端JavaScript之Ajax(一篇入门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是构建在同源策略的基础之上。


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


以下就是不同源:


前端: //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))

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


小结

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


1.创建一个xhr对象


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


3.判断HTTP的状态码


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


5.xhr.send()发送请求


今天你学废了吗?


✅  扫码免费获取IT基础课程 · IT技术干货 · 答疑解惑 · 职业测评

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

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程