xhr.open(method,url,false)
method:get和posturl:要求的目标urlfalse/true:是否异步发送要求。
注:
1、如果url不是绝对路径,那么便是相对付当前页面。
2、open语句并不会急速发送要求,须要send()方法。
3、只能向同一个域中利用相同端口和协议的URL发送要求。
要发送要求,须要再利用send方法:
xhr.send(null)
send方法的参数是指要发送的数据,如果没有的话须要写null。一样平常get办法不传数据,post方法须要传送数据。
xhr收到相应后,会有下面这些属性:
status:http状态statusText:http状态的解释responseText:相应主体文本responseXML:如果相应的内容类型是”text/xml”或”application/xml”,个中将保存着相应数据的XML文档接到相应后,首先检讨status,确定是否成功返回:
1、200相应成功;
2、304要求的资源没有被修正,可利用缓存内容;
可利用下面的代码检测相应状态:
xhr.open(34;get","example.txt",false);xhr.send(null);if((xhr.status>= 200 &&xhr.status< 300) ||xhr.status== 304) {alert(xhr.responseText);}else{alert("Request was unsuccessful: "+xhr.status);}
发送异步要求时,须要监控readyState属性,该属性有如下几个值:
0:未初始化。尚未调用open()方法1:启动。已调用open()方法,还未调用send()方法2:发送。已调用send()方法,还未接到相应3:吸收。已收到部分相应数据4:完成。已收到全部相应数据每次readyState的值变革一次,就会触发一次readystatechange事宜,以是可以在这个事宜来检讨readyState的值。
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); } }};
由于并不是所有浏览器都支持DOM2,以是采取DOM0级的方法来添加事宜处理程序。
21.1.2 HTTP头部信息头部信息有以下内容:
Accept:浏览器能够处理的内容类型。Accept-Charset:浏览器能够显示的字符集。Accept-Encoding:浏览器能够处理的压缩编码。Accept-Language:浏览器当前设置的措辞。Connection:浏览器与做事器之间连接的类型。Cookie:当前页面设置的任何Cookie。Host:发出要求的页面所在的域。Referer:发出要求的页面的URI。把稳,HTTP规范将这个头部字段拼写错了,而为担保与规范同等,也只能将错就错了。(这个英文单词的精确拼法该当是referrer。)User-Agent:浏览器的用户代理字符串。在open()方法之后,send()方法之前,通过调用setRequestHeader()可设置要求头:
xhr.setRequestHeader("Host","https://www.baidu.com");
利用getResponseHeader(“Host”)可以相应的值;
利用getAllResponseHeaders()可以得到一个包含所有头部信息的长字符串。
varmyHeader =xhr.getResponseHeader("Host");varallHeaders =xhr.getAllResponseHeaders();
21.1.3 GET要求
GET要求是将查询字符串经由编码(encodeURIComponent)后拼接到URL后面的。
下面的函数的浸染是将查询字符串经由编码后拼接到URL后面:
// 对查询参数进行编码并拼接functionaddURLParam(url,name,value) { url += (url.indexOf("?") == -1 ?"?":"&"); url +=encodeURIComponent(name) +"="+encodeURIComponent(value);}
那么完全的要求如下:
varxhr=newXMLHttpRequest();xhr.onreadystatechange=function() {if(xhr.readyState== 4){if((xhr.status>= 200 &&xhr.status< 300) ||xhr.status== 304){varmyHeader =xhr.getResponseHeader("Host"); varallHeaders =xhr.getAllResponseHeaders(); }else{alert("Request was unsuccessful"+xhr.status); } }};xhr.open("get","example.html",true);xhr.setRequestHeader("Host","https://www.baidu.com");xhr.send(null);
注:我在页面上写了个按钮和div区域,点击按钮时想向某站发送要求,然后将相应写到div中,涌现了以下的缺点:
Refused to set unsafe header "User-Agent"
Access to XMLHttpRequest at 'file:///K:/%E….' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
我本来是打算利用js来像python那样实现爬取内容的,但创造弗成。
21.1.4 post要求functionsubmitData() {varxhr = createXHR(); 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("post","postexample.php",true); xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");varform =document.getElementById("user-info"); xhr.send(serialize(form));}
post要求在open中的第一个参数是get,在send中是经由序列化的字符串,详细见serialize函数。
21.2 XMLHttpRequest 2级21.2.1 FormDataFormData类型可以方便的对数据进行序列化,这个紧张是用在post办法:
vardata =newFormData();data.append("name","伍德春");
也可以直接将form作为实例化的参数:
vardata =newFormData(document.forms[0]);
创建好data后,就可以将其作为send()方法的参数进行发送了。
xhr.send(newFormData(document.forms[0]));
21.2.2 超时设定
在xhr.open与xhr.send之间,通过xhr.timeout = 1000来设定超时时间,通过xhr.ontimeout = function(){//超时处理代码};来作为超时处理程序。
21.2.3 overrideMimeType()利用此方法可以担保把相应该作指定的类型来处理,方法须要在open与send之间
// 设置为XMLxhr.overrideMimeType("text/xml");
21.3 进度事宜loadstart:在吸收到相应数据的第一个字节时触发。progress:在吸收相应期间持续不断地触发。error:在要求发生缺点时触发。abort:在由于调用abort()方法而终止连接时触发。load:在吸收到完全的相应数据时触发。loadend:在通信完成或者触发error、abort 或load 事宜后触发。21.3.2 progress事宜
可以利用progrss事宜动态的更新进度:
xhr.onprogress=function(event) {vardivStatus =document.getElementById("status");if(event.lengthComputable){ divStatus.innerHTML="已吸收"+ event.position+"/"+ event.totalSize +"字节"; }};
这个事宜处理程序的指定须要在xhr.open()方法之前。
21.4 跨源资源共享CORS(Cross-Origin Resource Sharing)XHR工具只能访问与包含它的页面位于同一域中的资源。
xhr.setRequestHeader("Origin","https://www.baidu.com");
21.5 其他跨域技能21.5.1 图像ping21.5.2 JSONPJSON with padding添补式JSON或参数式JSON,即在要求参数中指定回调函数。
21.5.3 CometComet是一种做事器向页面推送数据的技能。能够让信息近乎实时的推送到页面上,非常适宜处理体育比赛的分数和股票报价(也适宜公司车间展示信息)。
21.5.4 做事器发送事宜