认识AJAX
ajax简介
AJAX全称为Asynchronous JavaScript And XML,就是异步的JS和XML。通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。AJAX不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。
AJAX的特点
AJAX的优点
- 可以无需刷新页面而与服务器进行通信。
- 允许你根据用户事件来更新部分页面内容。
AJAX的缺点
- 没有浏览历史,不能回退。
- 存在跨域的问题(同源)
- SEO不友好
常见使用ajax网站
百度的注册页面,输入已经注册的名字会返回false提示该名称已被使用。
ProcessOn网站,在线绘制图像。
今日头条下拉到底部会刷新出新的头条进行观看。
百度搜索时,输入几个字会有下拉框提示相关的关键字。
京东界面的二级菜单栏也是由ajax发送的数据。
ajax实际上是一种懒加载的模式。懒加载:用则加载,不用则不加载。
了解HTTP协议
HTTP(hypertext transport protocol)协议,即超文本传输协议,协定详细规定了浏览和万维网服务器之间的通信规则。
请求报文
重点是格式与参数,结构都是相同的
1 | GET /s?ie=utf-8 HTTP/1.1 行 |
响应报文
1 | HTTP/1.1 200 OK 行 |
XML简介
XML即可扩展标记语言。XML被设计用来传输和存储数据。XML和HTML类似,不同的是HTML中都是预定义标签,而XML中没有预定义标签,全都是自定义标签,用来表示一些数据。
比如我又一个学生数据:
1 | name:'孙悟空', |
用XML表示:
1 | <student> |
不过现在已经被JSON取代:
1 | { |
服务器搭建
express
因为ajax需要给服务端发送请求,而express正好可以搭建一个服务端,以便后续ajax请求的发送和接收。
express是基于node.js的,所以要安装好node.js,再执行以下操作。
搭建步骤
在VScode下打开终端,在终端中输入命令
1 | npm init --yes //用于初始化 |
执行完后再js文件中编写express服务机代码
1 | //引入express |
在终端执行node xxx.js开启服务器,服务则会在设定的端口下启动,可以在浏览器中输入127.0.0.1:8360/server访问到。
1 | node server.js //开启服务器 |
nodemon
express每次修改js文件都需要关闭服务,保存,然后再次启动。如果调试频繁,来回重启很麻烦,所以使用nodemon包:这个包可以监测文件变化,并自动保存重启。
安装
同样是需要node的npm环境,在终端命令行输入
1 | npm install -g nodemon |
服务器的启动也不再用node xxx.js,使用命令:
1 | nodemon server.js |
这时运行的服务器再次访问,修改内容无需重启服务器,内容也能改变。
Ajax的使用
原生AJAX
原生ajax的使用依赖于XMLHttpReques对象。话不多说,直接上代码,一看就懂。
1 | //1.创建对象 |
open()方法中第一个参数写GET就是GET请求,写POST就是POST请求,也可以写ALL。
send()方法中可以设置请求体,内容可以任意设置,但还是要根据需求来。
参数传递
在URL末尾添加一个问号,以&隔开不同的参数,如下:
1 | http://127.0.0.1:8360/server?user=admin&password=admin |
设置请求头
1 | xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded') |
上面这个内容不用管,这个方法设置后能够传入一个请求头,两个参数分别是请求头的名称和内容。一般可以把身份信息校验放到头部信息,当然这个也可以任意设置,但还是按需求来。
服务端响应JSON数据
无非是服务端返回的数据换成JOSN数据,服务端将JSON数据序列化成字符串,再返回给客户端。response.send(jsonStr)。客户端接收到之后再对数据进行处理。代码如下:
服务端的代码:
1 | const express = require('express'); |
客户端接收并处理:
1 | const result = document.getElementById('result'); |
IE缓存机制
IE浏览器会对ajax请求结果做一个缓存,再去发送请求的时候走的就是本地的缓存,而不是服务器的响应。
解决方式
在请求链接中传入一个参数,使每时每刻的参数不相同,IE就会认为是不同的请求,就不会走缓存,每一次都会重新发送请求。
1 | xhr.open("get",'http://127.0.0.1:8360/ie-server?ie='+Date.now()); |
但是这个做法在实际中是不会用的。
请求超时和网络异常处理
程序运行中时常会有网络超时的情况,服务端不能保证及时快速的反应,所以在请求超时和网络异常的时候给用户提醒,增加产品的体验。
此类问题可以调用XMLHttpRequest包的方法onerror()和ontimeout()来解决:
1 | const xhr = new XMLHttpRequest(); |
取消请求
请求过程中,在请求发送之后,但是在接收到响应之前,可以通过代码将请求取消掉。
取消请求使用abord()方法
1 | xhr.abord(); |
请求重复发送
有时服务器响应较慢,用户频繁点击发送请求,让服务器接收到很多个重复的请求,服务器压力增大。这个问题可以设置用户重复点击会关闭上一个请求,重新发送一个新的请求。
代码实现:
1 | var btn = document.getElementById('btn'); |
jQuery封装的AJAX
除了原生的ajax,jQuery也封装了ajax,格式是这样的:
1 | $.get(url,[data],[callback],[type]); |
看一个实例就差不多了:
1 | $('button').eq(0).click(function(){ |
通用方法
使用ajax()方法发送请求
1 | $.ajax({ |
这里只列举了一部分,更多的可以查jQuery文档
Axios的AJAX
axios是目前前端最热门的ajax工具库,使用频率很高,vue和react强烈推荐。
特点:
- 支持浏览器和node.js
- 支持promise
- 能拦截请求和响应
- 能转换请求和响应数据
- 能取消请求
- 自动转换JSON数据
- 浏览器端支持防止CSRF(跨站请求伪造)
使用axios
使用可以在页面中链入axios的CDN链接
1 | <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.0/axios.min.js"></script> |
跨域
同源策略
同源策略(Same-Origin Policy)是最早由Netscape公司提出,是浏览器的一种安全策略。
同源:当前网页和ajax请求的目标资源之间的url,两者之间的协议、域名、端口号必须完全相同。
注:ajax是默认遵循同源策略的,而违背同源策略无法发送ajax,称为跨域。
JSONP
JSONP(JSON with Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明才智开发出来,只支持get请求。
JSONP工作原理
在网页有一些标签天生具有跨域的能力,比如:img、link、iframe、script。JSONP就是利用script标签的跨域能力来发送请求的,
JSONP的使用
好麻烦,懒得搞 O(∩_∩)O
CORS
CORS(Cross Origin Resourse Sharing),跨域资源共享。CORS是官方的的跨域解决方法,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持get和post请求。跨域资源共享标准新增了一组HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。
CORS工作原理
CORS是通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应以后就会对响应放行。
CORS的使用
在服务器端进行设置
1 | response.setHeader("Access-Control-Allow-Origin","*") |
更多的相关属性设置可以查看这个文档