什么是AJAX?

会有一股神秘感。 提交于 2019-12-11 02:12:50

这里是修真院前端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析前端知识/技能。

大家好,我是 IT 修真院上海分院的何岳,一枚正直纯洁善良的web程序员

今天给大家分享一下,修真院官网 JS任务五,深度思考中的知识点——什么是AJAX?

1. 背景介绍

什么是AJAX?

async JavaScript and xml,异步的js和xml

ajax之所以称为异步的js和xml,主要原因是:当初最开始用ajax实现客户端和服务器端数据通信的时候,传输的数据格式一般都是xml格式的数据,所以把它称之为异步js和xml(现在一般都是基于json格式来进行数据传输的) 

2. 知识剖析

xml和异步的js

xml:可扩展的标记语言,作用是用来存储数据的(通过自己扩展的标记名称清晰的展示出数据结构)

xml:

<?xml version ="1.0" encoding ="UTF-8"?>

<root>

    <student>

        <name>张三</name>

        <age>25</age>

        <socre>

            <english>100</english>

            <math>99</math>

            <chinese>89</chinese>

        </socre>

        <name>李四</name>

        <age>24</age>

        <socre>

            <english>99</english>

            <math>97</math>

            <chinese>98</chinese>

        </socre>

    </student>

</root>

异步的js:这里的异步不是说ajax只能基于异步进行请求(虽然建议都是使用异步编程),这里的异步特指的是“局部刷新”

 

局部刷新vs全局刷新

全局刷新

在非完全前后端分离项目中,前端开发只需要完成页面的制作,并且把一些基础的人机交互效果使用js完成即可,页面中需要动态呈现内容的部分,都是交给后台做数据绑定和基于服务器进行渲染的(服务器端渲染) 

局部刷新

前后端完全分离的项目,页面中需要动态绑定的数据是交给客户端完成渲染的

1.向服务器端发送ajax请求

2.把从服务器端获取的数据解析处理,拼接成需要展示的html字符串

3.把拼接好的字符串替换页面中的某一部分内容(局部刷新),页面整体不需要重新加载,局部渲染即可 

 

基于原生实现ajax过程

<script>

    //-->创建一个ajax对象

    let xhr = new XMLHttpRequest(); //不兼容IE6及更低版本浏览器(IE6:ActiveXObject)

    //-->打开请求地址(可以理解为一些基础配置,但是并没有发送请求)

    xhr.open([method], [URL], [async], [user name], [user password]);

    //-->监听ajax,获取响应信息(获取响应头信息,获取响应主体信息)

    xhr.onreadystatechange = () => {

        if (xhr.readyState === 4 && xhr.status === 200) {

        let result = xhr.responseText; //获取响应主体中的内容

        }

    }

    //-->发送ajax请求(括号中的内容就是请求主体的内容)

    xhr.send(null);

</script> 

 

ajax请求方式

1.get系列请求(获取)

(1)get

(2)delete:从服务器端删除某些资源文件

(3)head:只想获取服务器端返回的响应头信息(响应内容不需要获取)

(4)...

2.post系列请求(推送)

(1)post

(2)put:向服务器中增加指定的资源文件

(3)...

不管哪一种请求方式,客户端都可以把一些信息传递给服务器端,服务器端也可以把信息返回给客户端,只是get系列一般以获取为主(给的少,拿回来的多);post系列一般以推送为主(给的多,拿回来的少);

(1)如果想获取一些动态展示信息,一般使用get请求,因为只需要向服务器端发送请求,告诉服务器端想要什么,服务器端就会把需要的数据返回

(2)在实现注册功能的时候,需要把客户输入的信息发送给服务器端进行存储,服务器端一般返回成功还是失败等状态,此时我们一般都是基于post请求完成的 

 

URL:请求数据地址(API地址)

真实项目中,后端会编写一个API文档,在API文档中汇总了获取哪些数据需要哪些地址,按照文档操作即可 

 

[ASYNC]

ASYNC:异步

SYNC:同步

设置当前ajax请求是异步的还是同步的,不写默认是异步(true),如果设置为false,则代表当前请求是同步的 

3. 常见的问题

get和post的区别

 

4. 解决方案

get系列请求和post系列请求,在真实项目中存在很多的区别:

1.get请求传递给服务器端的内容一般没有post传递给服务器端的多

原因:get请求传递给服务器端的内容一般都是基于URL地址问号传递参数来实现的;而post请求一般都是基于设置请求主体来实现的。各浏览器都有自己关于url最大长度的限制(谷歌:8kb,火狐:7kb,IE:2kb...),超过限制长度的部分,浏览器会自动截取掉,导致传递给服务器的数据缺失。理论上post请求通过请求主体传递是没有大小限制的,真实项目中为了保证传输的速率,也会限制大小(比如上传的资料或者图片会做大小的限制)

2.get请求很容易出现缓存(这个缓存不可控:一般我们都不需要),而post不会出现缓存(除非自己做特殊处理)

原因:get是通过url问好传参传递给服务器信息,而post是设置请求主体,设置请求主体不会出现缓存,但是URL问号传参就会

3.get请求没有post请求安全(post也不是十分安全,只是相对安全)

原因:get是通过url问好传参传递给服务器信息。有一种比较简单的黑客技术:URL劫持,也就是可以把客户端传递给服务器端的数据劫持掉,导致信息泄露 

5. 编码实战

6. 扩展思考

全局刷新的优缺点

 

[优点]

1.动态展示的数据在页面的源代码中可以看见,有利于SEO优化推广(有利于搜索引擎的收录和抓取)

2.从服务器端获取的结果就已经是最后要呈现的页面了,不需要客户端做额外的事情,所以页面加载速度快(前提是服务器端处理速度够快,能够处理过来),所以类似jd,taobao这些网站的首屏数据都是经由服务器端渲染的

[缺点]

1.如果页面中存在需要实时更新的数据,每一次想要展示最新的数据,页面都要重新刷新一次,这样是不行的

2.都交给服务器做数据渲染,服务器端压力太大,如果服务器端处理不过来,页面呈现的速度更慢(所以jd,taobao这类网站除了首屏是服务器端渲染的,其他屏都是客户端做数据渲染绑定)

3.这种模式不利于开发(开发效率低) 

7. 参考文献

https://www.cnblogs.com/smyhvae/p/8485028.html        

8.讨论问题:

问:

 1.局部刷新的优缺点?

 2.AJAX的状态码?

 3.ajax中其他常用的属性和方法

答:

1.[优点]

a.可以根据需求,修改页面中某一部分的内容(例如实时刷新),整体页面不刷新,性能好,体验好(所有表单验证,需要实时刷新的需求都要基于ajax实现)

b.有利于开发,提高开发的效率

    (1)前后端完全分离,后台不需要考虑前端如何实现,前端也不需要考虑后端用什么技术,真正意义上实现了技术的划分

    (2)可以同时进行开发:项目开发开始,首先制定前后端数据交互的接口文档(文档中包含了调取哪个接口或者那些数据等协议规定),后台把接口先写好

[缺点]

a.不利于SEO优化:第一次从服务器端获取的内容不包含需要动态绑定的数据,所以页面的源代码中没有这些内容,不利于SEO收录,后期经过js添加到页面中扥内容,并不会写在页面的源代码中(是源代码不是页面结构)

b.交由客户端渲染,首先需要把页面呈现,然后通过js异步ajax请求获取数据,然后数据绑定,浏览器把动态增加的部分重新渲染,无形中浪费了一些时间,没有服务器渲染页面呈现速度快 

    

 

2. xhr.readyState

0:UNSENT 未发送,只要创建一个ajax对象,默认就是零

1:OPENED 已经执行了xhr.OPEN这个操作

2:HEADERS_RECEIVED 当前ajax的请求已经发送,并且已经接收到服务器端返回的响应头信息了

3:LOADING 响应主体内容正在返回的路上

4:DONE 响应主体内容已经返回到客户端 

 

3. 通过let xhr = new XMLHttpRequest();

console.dir(xhr); 可以看到所有的属性和方法

感谢观看, 如有出错, 恳请指正

PPT链接 视频链接

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

------------------------------------------------------------------------------------------------------------
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,学习的路上不再迷茫。

技能树.IT修真院

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!