定制设计JavaScript之Ajax(一篇入门Ajax就够了)

一、概念

1.什么是

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

异步的JavaScript

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

XML

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

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

2.应用场景

注册页面

搜索提示

还有很多很多...

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


二、实现Ajax

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

  1. //test.josn的代码
  2. {
  3. "reply":"我收到啦!"
  4. }
  1. const xhr = new XMLHttpRequest();
  2. xhr.onreadystatechange = () => {
  3. if (xhr.readyState !== 4) return;
  4. if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
  5. console.log(xhr.responseText);
  6. }
  7. };
  8. xhr.open('GET', 'text.json', true);
  9. xhr.send(null);

执行结果:

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

执行步骤

1.创建xhr对象

const xhr = new XMLHttpRequest();

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

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

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 用于表示请求成功)

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

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

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不熟悉的,可以点这里:

  1. function ajax(url) {
  2. const p = new Promise((resolve, reject) => {
  3. const xhr = new XMLHttpRequest();
  4. xhr.open('GET', url, true)
  5. xhr.onreadystatechange = () => {
  6. if(xhr.readyState === 4){
  7. if((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304){
  8. resolve(
  9. JSON.parse(xhr.response)
  10. )
  11. }else{
  12. reject(new Error('Response error'))
  13. }
  14. }
  15. }
  16. xhr.send(null)
  17. })
  18. return p
  19. }
  20. const url = 'text.json'
  21. 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()发送请求

今天你学废了吗?

 

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发