Ajax技术用于实现“无需刷新页面即可从获得服务端数据”。在Ajax出来前,只能用一些hack手段来实现不刷新页面的数据更新。
Ajax技术的核心是XMLHttpRequest(简称XHR)。
1.XMLHttpRequest对象
讲了一下创建xhr对象。创建本来是没什么好说的,但是IE7以下有些特别,所以作者介绍了一些判断来判断去的代码,用来兼容各浏览器。
1.1 XHR的用法
介绍了xhr对象怎么调用它的方法,怎么传参,怎么接收结果。
其中我比较注意的几点:
(1)xhr对象有readyState属性,0未初始化 1启动 2发送 3接收 4完成。
(2)xhr对象有readystatechange事件,可以监听。
(3)xhr对象有abort方法可以调用,能取消异步请求。调用后,readystatechange事件不再会触发,也不再允许访问与响应有关的对象属性。
(4)不建议重用xhr对象 (大概意思是建议每用一次新建一个,用完一次就销毁一个)
1.2 HTTP头部信息
介绍了xhr对象与HTTP请求头之间的一些交互
摘抄几点:
(1)xhr的setRequestHeader方法可以设置自定义的请求头部信息。(应在open方法调用之后、send方法调用之前设置)
(2)xhr的getResponseHeader方法可以获取响应头部信息
(3)xhr的getAllResponseHeaders方法可以一次性取得一个包含所有头部信息的长字符串
1.3 GET请求
GET请求的参数是直接加到URI 末尾的。
需要注意的是加到URI末尾的查询字符串格式应当正确。
查询字符串中的参数和值应使用encodeURIComponent进行编码。
1.4 POST请求
POST请求的主体可以包含各种格式的数据。
调用xhr的send方法时,传入参数,即可指定POST请求的数据。
使用POST请求时,如想模拟表单提交,可指定请求头Content-Type为application/x-www-form-urlencoded,然后给send方法传入想提交的表单序列化后的字符串。
POST请求消耗的资源比GET请求多,发送相同的数据的情况下,GET请求速度比POST请求快,甚至可达到POST速度的两倍。
2.XMLHttpRequest 2级
2.1 FormData
FormData用于序列化表单,以及创建与表单格式相同的数据。
它的方便之处在于不用明确在xhr对象设置请求头,xhr对象能够识别send方法传入的是FormData实例,自动配置请求头。
2.2 超时设定
在open方法调用后、send方法调用前,xhr.timeout=毫秒数,可以设置超时时间。
超时时,xhr的状态可能已经走到4,但超时后,xhr对象不允许访问status属性,所以在onreadystatechange回调中,访问status属性要加try catch逻辑。
2.3 overrideMimeType方法
这个方法用于重写xhr响应的MIME类型,这样可以由前端决定按什么格式处理响应内容。
注意要在send方法调用前调用。
3.进度事件
有6个进度事件:loadstart(开始接收响应数据时触发),progress(接收响应期间不断触发),error(请求发生错误时触发)、abort(主动取消后触发)、load(接收到完整响应数据时触发)、loadend(在触发load/abort/error/通信完成时触发)
3.1 load事件
说了一些load事件回调函数的写法,和浏览器差异。
我搞不懂为什么它说“Firefox实现中引入了load事件,用以替代readystatechange事件”,所以到底还有没有readystatechange事件!?
3.2 progress事件
progress事件会给回调函数传入一个参数event对象,
event.target 就是xhr对象
event.lengthComputable 表示进度信息是否可用的布尔值
event.position 表示已经接收的字节数
event.totalSize 表示根据响应头部Content-Length指定的字节数
必须在open方法调用前添加onprogress事件回调。
4.跨源资源共享
xhr实现ajax通信受限于跨域安全策略。CORS(跨域资源共享)是W3C的一个工作草案,定义了在访问跨域资源时,浏览器和服务器应该如何沟通。
CORS的基本思想,就是使用自定义的HTTP头部让浏览器于服务器进行沟通,从而决定请求或响应应该成功还是应该失败。
请求头Origin和响应头Access-Control-Allow-Origin两边对不成功,浏览器就会驳回请求。
4.1 IE对CORS的实现
略。
4.2 其它浏览器对CORS的实现
略。
4.3 Preflighted Requeusts
就是平时抓包看到的预请求机制。浏览器觉得请求不是简单请求,就会向服务器验证是否允许前端发送这样的请求。
4.4 带凭据的请求
跨域请求默认不带凭据(cookie、HTTP认证及客户端SSL证明等),但可以设置成带的。
如果服务端允许请求端带凭据,请求才会成功返回给JavaScript,不然不会返回。
4.5 跨浏览器的CORS
略。
5.其它跨域技术
介绍除了CORS以外的跨域技术
5.1 图像Ping
<img>可以从任何url加载图像,不用担心是否同源。所以有了图像ping,这是一种与服务器进行单向的跨域通信的一种方式,请求的数据是查询字符串的形式,响应的可以是任意内容。
图像ping常用于跟踪用户点击页面或动态广告曝光次数。它的缺点:1.只能发送GET请求 2.无法访问服务器的响应文本
不知道为什么说“无法访问服务器的响应文本”,img的内容不能搞出来的吗??
5.2 JSONP
JSONP是通过动态script元素来实现的,使用时,为script元素指定一个跨域的url,当加载完成后,加载到的代码就开始运行。
一般大家是这么实现的:服务端返回一份js文件。这个js文件的内容,是把一堆JSON字符串丢给一个函数。
这个函数名字在请求端指定url的时候就拼接在url参数里了。
服务端从url读取到那个函数的名字(对它来说就是个字符串),然后拼接:函数名(要返回的JSON);这就是那个js文件的内容了。
前端加载到js以后自动执行:函数名(返回的JSON);
当然,这个函数也是前端已经定义好的。
通过这种协作,服务端把数据给到了前端js。
它的优点是可以访问响应文本,不像img拿不到响应内容。缺点是不安全,动态script元素加载跨域的资源代码,如果这个代码含有恶意代码,就很不安全。
https://blog.csdn.net/hansexploration/article/details/80314948 这博客讲得比红书清晰多了
5.3 Comet
comet是建立在Ajax基础上,但是能让服务器主动向页面推送数据的技术。
有两种实现方式,一种是“长轮询”,就是页面先发送请求,服务端什么时候想推送了什么时候再响应。
第二种是“流”,一个HTTP连接一直不结束生命周期,然后服务端时不时地再推一些内容到前端。对前端来说,xhr对象的readyState时不时地变成3(接收),每次变成3,xhr.responseText都多了一些内容。
5.4 服务器发送事件
SSE(服务器发送事件),SSE API用于创建“能让服务器主动推送的HTTP连接”,这个API把短轮询(最蠢的那种)、长轮询、HTTP流的实现都封装成现成的方法了,还能自动在异常断开时重连。
5.5 Web Socket
不多说了,平时工作中也有用。
它使用的是另外的协议,比HTTP协议好在发送的数据量少,开销少。
5.6 SSE 与 Web Sockets
比较两者优劣。略。
6.安全
分析了安全性。略。
最后:关于Ajax想要完整了解的话,话题非常庞大,有专门讨论Ajax的书,比如《Ajax高级程序设计》