Ajax定义:Ajax(Asynchronous JavaScript+XML,即异步JavaScript加XML), 是一种通过异步请求的方式向服务器请求数据,在无需重新刷新整个网页的情况下,能够更新部分网页的技术。
作用:更好的提升用户的体验,并减少网络数据的传输量。
Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器。像—些数据验证和数据处理等都交给Ajax引擎自己来做,,只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。
ajax主要应用与表单验证、动态加载数据,按照需求取数据、改善用户体验、数据局部刷新等等。
所有现代浏览器都通过XMLHttpRequest构造函数原生支持XHR对象
let xhr = new XMLHttpRequest();
open()方法接收3个参数,分别是:请求类型("get"、"post"等)、请求URL,以及表示请求是否异步的布尔值(true 异步,false 同步),格式如下:
xhr.open('get','/api/login','true');
调用open方法不会实际发送请求,只是为发送请求做好准备。
注意:只能访问同源URL,也就是域名相同、端口相同、协议相同。如果请求的URL与发送请求的页面在任何方面有所不同,则会抛出安全错误。
要发送定义好的请求,必须调用send()方法,调用send()之后,请求就会发送到服务器
let xhr.open("get","example.text",true); xhr.send(null);//send方法接收一个参数,是作为请求体发送的数据,如果不需要发送请求体,则必须传null
0:未初始化(Uninitialized)。尚未调用open()方法。
1:已经打开(Open)。已经调用open()方法,尚未调用send()方法。
2:已发送(Sent)。已调用send()方法,尚未收到响应。
3:接收中(Receiving)。已经收到部分响应。
4:完成(Complete)。已经收到所有的响应,可以使用了。
每次readyState从一个值变为另一个值,都会触发readystatechange事件。因此,可以借此机会检查readyState的值。一般我们只关心readyState值是4,表示数据已就绪。为保证跨浏览器兼容,onreadystatechange事件处理程序应该在调用open()之前赋值。如下:
let xhr=new XMLHttpRequest(); xhr.onreadystatechange=function(){ if(xhr.readyState==4){ if(xhr.status>=200 && xhr.status<300 || xhr.status==304){ alert(xhr.responseText);//成功时响应体返回的实体 }else{ alert('Request was unsuccessful:'+xhr.status);//失败时返回响应的状态 } } }; xhr.open('get','example.txt',true); xhr.send(null);
1XX:信息性状态码,表示接受的请求正在处理
2XX:成功状态码,表示请求正常处理
3XX:重定向状态码,表示需要附加操作来完成请求
4XX:客户端错误状态,表示服务器无法处理请求
5XX:服务器错误状态,表示服务器处理请求出错
每个HTTP请求和响应都会携带一些头部字段,XHR对象会通过一些方法暴露于请求和响应相关的头部字段。默认情况下,XHR请求会发送一下头部字段。
Accept:浏览器可以处理的内容类型。
Accept-Charset:浏览器可以显示的字符集。
Accept-Encoding:浏览器可以出来的压缩编码类型。
Accept-Language:浏览器使用的语言。
connection:浏览器与服务器的连接类型。
Cookie:页面中设置的cookie。
Host:发送请求的页面所在的域。
Referer:发送请求的页面的URL。
User-Agent:浏览器的用户代理字符串。
发送额外请求头可以使用setRequestHeader()方法,这个方法接收两个参数,分别是请求头的名称和值。注意:为保证请求头部被发送,必须在open()之后,send()之前被调用setRequestHeader()
例子如下:
let xhr=new XMLHttpRequest(); xhr.onreadystatechange=function(){ if(xhr.readyState==4){ if(xhr.status>=200 && xhr.status<300 || xhr.status==304){ alert(xhr.responseText);//成功时响应体返回的实体 }else{ alert('Request was unsuccessful:'+xhr.status);//失败时返回响应的状态 } } }; xhr.open('get','example.txt',true); xhr.setRequestHeader("MyHeader","MyValue");//open()之后send()之前 xhr.send(null);
1.GET请求
最常用的请求方法,用于向服务器查询某些信息,必要时,需要在get请求的URL后面添加查询字符串参数,对于XHR而言,查询字符串必须正确编码后添加到URL后面,然后在传给open()方法。
查询字符串中的每个名和值都必须使用encodeURICompenent编码,所有的名/值对必须以和号(&)分隔,如下所示:
xhr.open('get','example.php?name1=value1&name2=value2',true);//get请求参数拼接在url上面
2.POST请求
第二个最常用的请求,用于向服务器发送 应该保持的数据。例子如下:
xhr.open("post",'/api/login',true); xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');//配置请求头 xhr.send('username=xx&password=xxx');//发送的请求数据,post放在send里面
/* *@method jsonUrl(josn) 处理json格式数据,返回成get请求URL数据格式name1=value1&name2=value2 */ function jsonUrl(json){ var res=''; var arr=[]; for(var key in json){//for in 遍历对象获取属性和值key为属性,json[key]为对应属性值 arr.push(key+'='+json[key]) } res=arr.join('&'); return res; } /* *@method ajax(json) 封装ajax */ function ajax(json){ if(!json){ alert('需要传值'); return; } //默认值的设定 if(!json.url){ alert('后台的地址必填项'); return } json.type=json.type || 'get'; json.data=json.data || {}; //1、创建一个ajax对象 var oAjax; //考虑兼容性 if(window.XMLHttpRequest){ oAjax=new XMLHttpRequest(); }else if(window.ActiveObject){ //兼容IE6一下版本 oAjax=new ActiveXobject('Microsoft.XMLHTTP'); } //.toLowerCase() 转换成小写 switch (json.type.toLowerCase()){ case 'get': //2、创建链接 oAjax.open('请求的方式','请求的地址',是否异步) oAjax.open('get',json.url+'?'+json2url(json.data),true) //3、发送 oAjax.send(); break; case 'post': //2、创建链接 oAjax.open('请求的方式','请求的地址',是否异步) oAjax.open('post',json.url,true); //请求头的类型 oAjax.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); //3、发送 oAjax.send(json2url(json.data)); break; } //4.等待接收消息 oAjax.onreadystatechange=function () { if(oAjax.readyState==4){//通讯已经完成,数据全部接收 if(oAjax.status>=200 && oAjax.status<300 || oAjax.status==304){//网络状态是成功 /*console.log(oAjax.responseText)*/ json.success && json.success(oAjax.responseText); }else{ json.error && json.error(oAjax.status); } } } }
基本的使用示例:
ajax({ url:'api/login'//后台的地址 type:'post', data:{ username:'username', password:'password', }, success:function(data){ //服务器返回响应 } //异常处理 error:function(err){ console.log(err) } })