在上篇笔记中,咱们主要谈了一些概述和跨域的问题,这一次咱们聊聊请求和响应的具体内容。
咱们在建立了XHR对象后,接着须要用两个方法来发送请求:open()和send(),这两个方法有点像赛跑前的两个步骤:预备、跑。在open()中,并无实际发送请求,只是一个“预备”动做,真正的发送要到send()中了。php
open()能够传递三个参数:html
send()的参数只有一个,是运用在post方式的请求中,以string的形式。前端
如下是一个例子:segmentfault
xhr.open("GET","example.php",true); xhr.send(); //post不须要传递参数; xhr.open("POST","example.php",true); xhr.send(); //post须要传递参数; xhr.open("POST","example.php",true); xhr.setRequestHeader("Content-type","application/x-www-form-urlcoded"); xhr.send("fname=henry&lname=ford")
get经常使用于查询数据,有时候,须要咱们用某种指定的格式把参数追加到url的末尾。若是格式不正确的话,会出现错误。跨域
举一个例子:浏览器
xhr.open("get","example.php?name1=value1&name2=value2",true"); xhr.send();
post多用于向服务器提交应该被保存的数据。与get不一样的是,post应该以发送的数据做为请求的主体。参数则不须要写在url里了,而是写在send里,在这里,能够传递XML DOM文档也能够传递字符串。固然,要注意的是,若是只是简单的,没有数据传递的POST请求,那么和GET请求同样,在send()中不须要添加什么。若是须要POST数据,我么要用setRequestHeader()
来添加HTTP头,而后在send()中用参数的形式添加数据传递。服务器
每一个HTTP请求都带有头信息,因此咱们发送一个AJAX请求时,实际上也会发送相关的头信息。默认状况下,下列的头信息会被发送出去:app
使用setRequestHeader()
能够设置自定义的头信息。这个方法接收两个参数:头部字段的名称和值。例如:异步
xhr.setRequestHeader("Content-type","application/x-www-form-urlcoded"); xhr.setRequestHeader("MyHeader","MyValue");
要注意的是:setRequestHeader
方法须要在open()和send()中间设置,这样才能成功发送请求的头部信息。async
当咱们发送请求后,一切顺利,服务器也顺利发回了响应,那么咱们要怎么来获取这些响应呢?
这是获取两种不一样格式的响应,esponseText
是字符串形式,responseXML
则是XML形式。
举一个例子:
var xhr; if(window.XMLHttpRequest){ xhr=new XMLHttpRequest(); }else{ xhr=new ActiveXObject("Microsoft.XMLHTTP"); } xhr.onreadystatechange=function(){ if(xhr.readyState==4 && xhr.status==200){ document.getElementById("myDiv").innerHTML=xhr.responseText; } } xhr.open("get","example.php",true); xhr.send();
就是这样。
XHR的发展也促使W3C着手制定更为完善的2级规范。在这套规范里,有一些内容须要了解。
为了实现表单数据的序列化,在Web应用中更方便地传输数据,2级规范定义了FormData类型。
下面是一个建立FormData实例的例子:
<form id="myForm" action="" method="post"> <input type="text" name="name">名字 <input type="password" name="psw">密码 <input type="submit" value="提交"> </form>
var data=new FormData(); //直接添加键值对 data.append("nama","Mike"); //经过向构造函数中传入表单元素也可 //这是一个表单元素 var form=document.getElementById("myForm"); //传入 var data=new FormData(form); xhr.send(data); //获取 var name=data.get("name"); var psw=data.get("psw");
建立了FormData的实例后,能够直接传到send中。
关于更详细的FormData知识,请参考这篇文章:
系统学习前端之FormData详解 - 前端与生活 - SegmentFault
最先是IE8为XHR添加了timeout属性,后来被XHR 2级规范收入。
当给timeout设置了数值后,规定时间内没有响应,就会触发timoeout事件,进而调用ontimeout。
这是一个例子:
var xhr; ... xhr.open("get","example.php",true); xhr.timeout=1000; xhr.ontimeout=function(){ alert("Request is not return in a second" }; xhr.send();
XHR 2的进度事件定义了XHR在请求的不一样阶段触发不一样的事件,具体的有6个事件:
每一个浏览器所支持的事件不彻底相同,好比IE8就支持load事件。有了这些不一样的事件支持,开发者能够免去检查readyState之类的工做,更加的方便。
其中load事件和progress事件比较重要。load事件会在接收到完整的响应数据时触发,所以咱们就不须要再检查readyState属性了,只要确保XHR的status为200就能够了。
而progress事件则会为XHR在浏览器接收数据期间周期性地触发。在触发时,它会额外地提供三个属性:
有了这些信息,咱们能够创造一个进度指示器:
var xhr=createXHR(); xhr.onload=function(event){ ... } xhr.onprogress=function(event){ var divStatus=document.getElementById("status"); if(event.lengthCoputable){ divStatus.innerHTML="Reiceived"+event.position+"of"+event.totalSize+"bytes"; } };
这里要注意的是:必须在调用open()方法以前添加progress事件处理程序。