AJAX基础
内容:
1.什么是AJAX
2.如何使用AJAX
3.将AJAX封装成函数
4.AJAX其他封装
5.AJAX同步与异步
6.jQuery中Ajax方法的使用
1.什么是AJAX
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术
AJAX = Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求
AJAX 是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,使网页实现异步更新。这意味着可以在不重载整个页面的情况下,对网页的某些部分进行更新。
而传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个页面。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
2.如何使用AJAX
用JavaScript写一个完整的AJAX代码并不复杂,但是需要注意:AJAX请求是异步执行的,也就是说,要通过回调函数获得响应
在现代浏览器上写AJAX主要依靠XMLHttpRequest
对象:
1 // GET 2 // 1.创建 AJAX 对象 3 var r = new XMLHttpRequest() 4 // 2.连接 - 设置请求方法和请求地址 5 r.open('GET', '/login', true) 6 // 3.发送请求 7 r.send() 8 // 4.接受响应 9 r.onreadystatechange = function() { 10 console.log('state change: ', r) 11 } 12 13 14 // POST 15 // 1.创建 AJAX 对象 16 var r = new XMLHttpRequest() 17 // 2.连接 - 设置请求方法和请求地址 18 r.open('POST', '/login', true) 19 // 3.设置发送的数据的格式 20 r.setRequestHeader('Content-Type', 'application/json') 21 // 4.发送请求 22 var account = { 23 username: 'gua', 24 password: '123', 25 } 26 var data = JSON.stringify(account) 27 r.send(data) 28 // 5.接受响应 29 r.onreadystatechange = function() { 30 if (r.readyState === 4) { 31 console.log('state change: ', r, r.status, r.response) 32 // 转换格式 33 var response = JSON.parse(r.response) 34 console.log('response', response) 35 } else { 36 console.log('change') 37 } 38 }
当然我们也可以把上述过程封装一下:
1 var ajax = function(method, path, data, responseCallback) { 2 // method是请求方法(GET or POST) path是请求路径 3 // data是发送的数据(对象类型) responseCallback是响应函数 4 5 6 }
注意:
- method是请求方法,一般是GET or POST
- path是请求路径,一般不能跨域请求
- data是发送到服务端的数据,是字符串或列表格式
- responseCallback是回调函数,此回调函数将在服务器响应后调用,一般给此回调函数传入服务器响应数据,然后回调函数中的代码实际上是前端操作页面(增删改查)的代码
3.将AJAX封装成函数
1 /* 2 ajax 函数 3 */ 4 var ajax = function(method, path, data, reseponseCallback) { 5 var r = new XMLHttpRequest(); 6 // 设置请求方法和请求地址 7 r.open(method, path, true); 8 // 设置发送的数据的格式为 application/json 9 // 这个不是必须的 10 r.setRequestHeader('Content-Type', 'application/json'); 11 // 注册响应函数 12 r.onreadystatechange = function() { 13 if(r.readyState === 4) { 14 // r.response 存的就是服务器发过来的放在 HTTP BODY 中的数据 15 reseponseCallback(r.response); 16 } 17 }; 18 // 把数据转换为 json 格式字符串 19 data = JSON.stringify(data); 20 // 发送请求 21 r.send(data); 22 };
4.AJAX其他封装
AJAX其他封装方法如下:
1 // AJAX的GET方法 2 var ajaxGet = function(url, callback) { 3 /* 4 实现 ajaxGet 函数, 用 GET 方法请求一个 URL 5 url 是一个 URL 6 callback 是一个函数, 在接受服务器响应后调用并传递参数给它 7 */ 8 var r = new XMLHttpRequest() 9 r.open('GET', url, true) 10 // 设置发送的数据的格式为 application/json (API要求就要设置 不要求就不用设置) 11 r.setRequestHeader('Content-Type', 'application/json'); 12 r.onreadystatechange = function(event) { 13 if(r.readyState === 4) { 14 // r.response是服务端响应的数据 15 callback(r.response) 16 } 17 } 18 r.send() 19 } 20 21 22 // AJAX的POST方法 23 var ajaxPost = function(url, data, callback) { 24 /* 25 实现 ajaxPost 函数, 用 POST 方法向一个 URL 提交数据 26 url 是一个 URL data 是提交到服务器的数据 27 callback 是一个函数, 在接受服务器响应后调用并传递参数给它 28 */ 29 var r = new XMLHttpRequest() 30 r.open('GET', url, true) 31 // 设置发送的数据的格式为 application/json (API要求就要设置 不要求就不用设置) 32 r.setRequestHeader('Content-Type', 'application/json'); 33 r.onreadystatechange = function(event) { 34 if(r.readyState === 4) { 35 // r.response是服务端响应的数据 36 callback(r.response) 37 } 38 } 39 // 把数据转换为 json 格式字符串 -> 字典转换成字符串 40 data = JSON.stringify(data) 41 r.send(data) 42 } 43 44 45 // AJAX参数全部封装成一个request对象 46 var ajax = function(request) { 47 /* 48 request 是一个 object, 有如下属性 49 method, 请求的方法, string 50 url, 请求的路径, string 51 data, 请求发送的数据, 如果是 GET 方法则没这个值, string 52 callback, 响应回调, function 53 contentType , 提交数据的类型, API要求就要指定 54 */ 55 var r = new XMLHttpRequest() 56 r.open(request.method, request.url, true) 57 if (request.contentType !== undefined) { 58 r.setRequestHeader('Content-Type', request.contentType) 59 } 60 r.onreadystatechange = function(event) { 61 if(r.readyState === 4) { 62 request.callback(r.response) 63 } 64 } 65 if (request.method === 'GET') { 66 r.send() 67 } else { 68 r.send(request.data) 69 } 70 } 71 72 // ajax函数的使用实例 73 var account = { 74 'username': 'xiaogua', 75 password: '123' 76 } 77 var data = JSON.stringify(account) 78 var r = { 79 method: 'POST', 80 url: '/login', 81 contentType: 'application/json', 82 data: data, 83 callback: function(response) { 84 console.log('响应', response) 85 var res = JSON.parse(response) 86 if (res.success) { 87 window.location.href = '/' 88 } else { 89 alert('登录失败') 90 } 91 } 92 } 93 ajax(r)
5.AJAX同步与异步
AJAX同步与异步:上述open方法的第三个参数为true或false,true表示使用异步请求,而false表示使用同步请求,一般AJAX都使用异步请求也就是说AJAX的open方法第三个参数一般设置为true!
关于同步与异步:
- 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式
- 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式
同步请求: 客户端请求(等待)->服务端处理->响应->页面载入(缺少对象:XMLhttpRequest) 这时候如果有错误,只能再次发送请求,再次等待
异步请求:比如当你填写邮箱地址的时候,页面当时就把邮箱地址发送到了服务器(也就是页面发送了一个请求),服务器做处理和响应,得到你的邮箱地址填写重复了,把响应结果发给页面,在这个过程中你仍然可以填写其他内容,这时候服务器会提示你有重复的邮箱地址,在页面上的表现只是邮箱地址旁别加了一行字或者把整个文本框标红,并没有重新刷你的页面,所有的填写错误会实时的显示出来,你也会实时的更正。这个过程中,你会有整个页面的刷新,也不会有整个页面的提交和等待,最后提交,一切都会搞定的
使用异步请求页面上的操作和服务器端的操作互相之间不会造成阻塞
面试题 - 建立一个异步请求的过程:
- new一个XHR对象
- 调用open方法
- send一些数据
- 对过程进行监听,来知道服务器是不是正确地做出了响应,接着可以做一些事情比如说向页面中插入元素(提示信息、成功信息等)
6.jQuery中Ajax方法的使用
使用之前引用jQuery,然后写下以下代码即可:
1 $.ajax({ 2 type : "post", // 向后台请求的方式,有post,get两种方法 不写默认为get 3 url : "xxx", // url填写的是请求的路径 4 cache : false, // 缓存是否打开 5 data : { 6 "name" : "xxx", 7 "age" : 22 8 }, // 请求的数据 9 dataType : 'json', // 请求的数据类型 10 success : function(data) { // 请求的返回成功的方法 11 xxx 12 }, 13 error : function(XMLHttpRequest, textStatus, errorThrown) { 14 alert(textStatus); 15 alert("失败了"+errorThrown) 16 } 17 });