摘要:與不同的是,應(yīng)該以發(fā)送的數(shù)據(jù)作為請(qǐng)求的主體。有了這些不同的事件支持,開發(fā)者可以免去檢查之類的工作,更加的方便。其中事件和事件比較重要。而事件則會(huì)為在瀏覽器接收數(shù)據(jù)期間周期性地觸發(fā)。
在上篇筆記中,我們主要談了一些概述和跨域的問(wèn)題,這一次我們聊聊請(qǐng)求和響應(yīng)的具體內(nèi)容。向服務(wù)器發(fā)起請(qǐng)求
我們?cè)趧?chuàng)建了XHR對(duì)象后,接著需要用兩個(gè)方法來(lái)發(fā)送請(qǐng)求:open()和send(),這兩個(gè)方法有點(diǎn)像賽跑前的兩個(gè)步驟:預(yù)備、跑。在open()中,并沒(méi)有實(shí)際發(fā)送請(qǐng)求,只是一個(gè)“預(yù)備”動(dòng)作,真正的發(fā)送要到send()中了。
open和sendopen()可以傳遞三個(gè)參數(shù):
method:請(qǐng)求的類型,GET或POST之類;
url:文件在服務(wù)器的位置;
async:同步或是異步,默認(rèn)異步,當(dāng)選擇默認(rèn)時(shí),我們可以選擇不填這個(gè)參數(shù)。
send()的參數(shù)只有一個(gè),是運(yùn)用在post方式的請(qǐng)求中,以string的形式。
以下是一個(gè)例子:
xhr.open("GET","example.php",true); xhr.send(); //post不需要傳遞參數(shù); xhr.open("POST","example.php",true); xhr.send(); //post需要傳遞參數(shù); xhr.open("POST","example.php",true); xhr.setRequestHeader("Content-type","application/x-www-form-urlcoded"); xhr.send("fname=henry&lname=ford")get和post
get常用于查詢數(shù)據(jù),有時(shí)候,需要我們用某種指定的格式把參數(shù)追加到url的末尾。如果格式不正確的話,會(huì)出現(xiàn)錯(cuò)誤。
舉一個(gè)例子:
xhr.open("get","example.php?name1=value1&name2=value2",true"); xhr.send();
post多用于向服務(wù)器提交應(yīng)該被保存的數(shù)據(jù)。與get不同的是,post應(yīng)該以發(fā)送的數(shù)據(jù)作為請(qǐng)求的主體。參數(shù)則不需要寫在url里了,而是寫在send里,在這里,可以傳遞XML DOM文檔也可以傳遞字符串。當(dāng)然,要注意的是,如果只是簡(jiǎn)單的,沒(méi)有數(shù)據(jù)傳遞的POST請(qǐng)求,那么和GET請(qǐng)求一樣,在send()中不需要添加什么。如果需要POST數(shù)據(jù),我么要用setRequestHeader()來(lái)添加HTTP頭,然后在send()中用參數(shù)的形式添加數(shù)據(jù)傳遞。
HTTP頭部信息每個(gè)HTTP請(qǐng)求都帶有頭信息,所以我們發(fā)送一個(gè)AJAX請(qǐng)求時(shí),實(shí)際上也會(huì)發(fā)送相關(guān)的頭信息。默認(rèn)情況下,下列的頭信息會(huì)被發(fā)送出去:
Accept;
Accept-Charset;
Accept-Ending;
Accept-Language;
Connection;
Cookie;
Host;
Refer;
User-Agent;
使用setRequestHeader()可以設(shè)置自定義的頭信息。這個(gè)方法接收兩個(gè)參數(shù):頭部字段的名稱和值。例如:
xhr.setRequestHeader("Content-type","application/x-www-form-urlcoded"); xhr.setRequestHeader("MyHeader","MyValue");
要注意的是:setRequestHeader方法需要在open()和send()中間設(shè)置,這樣才能成功發(fā)送請(qǐng)求的頭部信息。
服務(wù)器響應(yīng)當(dāng)我們發(fā)送請(qǐng)求后,一切順利,服務(wù)器也順利發(fā)回了響應(yīng),那么我們要怎么來(lái)獲取這些響應(yīng)呢?
responseText和responseXML這是獲取兩種不同格式的響應(yīng),esponseText是字符串形式,responseXML則是XML形式。
舉一個(gè)例子:
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 2級(jí)XHR的發(fā)展也促使W3C著手制定更為完善的2級(jí)規(guī)范。在這套規(guī)范里,有一些內(nèi)容需要了解。
FormData為了實(shí)現(xiàn)表單數(shù)據(jù)的序列化,在Web應(yīng)用中更方便地傳輸數(shù)據(jù),2級(jí)規(guī)范定義了FormData類型。
下面是一個(gè)創(chuàng)建FormData實(shí)例的例子:
var data=new FormData(); //直接添加鍵值對(duì) data.append("nama","Mike"); //通過(guò)向構(gòu)造函數(shù)中傳入表單元素也可 //這是一個(gè)表單元素 var form=document.getElementById("myForm"); //傳入 var data=new FormData(form); xhr.send(data); //獲取 var name=data.get("name"); var psw=data.get("psw");
創(chuàng)建了FormData的實(shí)例后,可以直接傳到send中。
關(guān)于更詳細(xì)的FormData知識(shí),請(qǐng)參考這篇文章:
系統(tǒng)學(xué)習(xí)前端之FormData詳解 - 前端與生活 - SegmentFault
最早是IE8為XHR添加了timeout屬性,后來(lái)被XHR 2級(jí)規(guī)范收入。
當(dāng)給timeout設(shè)置了數(shù)值后,規(guī)定時(shí)間內(nèi)沒(méi)有響應(yīng),就會(huì)觸發(fā)timoeout事件,進(jìn)而調(diào)用ontimeout。
這是一個(gè)例子:
var xhr; ... xhr.open("get","example.php",true); xhr.timeout=1000; xhr.ontimeout=function(){ alert("Request is not return in a second" }; xhr.send();進(jìn)度事件
XHR 2的進(jìn)度事件定義了XHR在請(qǐng)求的不同階段觸發(fā)不同的事件,具體的有6個(gè)事件:
loadstart;
progress;
error;
abort;
load;
loadend;
每個(gè)瀏覽器所支持的事件不完全相同,比如IE8就支持load事件。有了這些不同的事件支持,開發(fā)者可以免去檢查readyState之類的工作,更加的方便。
其中l(wèi)oad事件和progress事件比較重要。load事件會(huì)在接收到完整的響應(yīng)數(shù)據(jù)時(shí)觸發(fā),因此我們就不需要再檢查readyState屬性了,只要確保XHR的status為200就可以了。
而progress事件則會(huì)為XHR在瀏覽器接收數(shù)據(jù)期間周期性地觸發(fā)。在觸發(fā)時(shí),它會(huì)額外地提供三個(gè)屬性:
lengthComputable;表示進(jìn)度信息是否可用
position;表示已經(jīng)接收的字節(jié)數(shù)
totalSize;表示響應(yīng)頭確定的預(yù)期字節(jié)數(shù)
有了這些信息,我們可以創(chuàng)造一個(gè)進(jìn)度指示器:
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"; } };
這里要注意的是:必須在調(diào)用open()方法之前添加progress事件處理程序。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92857.html
摘要:網(wǎng)上有很多前端的學(xué)習(xí)路徑文章,大多是知識(shí)點(diǎn)羅列為主或是資料的匯總,數(shù)據(jù)量讓新人望而卻步。天了解一個(gè)前端框架。也可以關(guān)注微信公眾號(hào)曉舟報(bào)告,發(fā)送獲取資料,就能收到下載密碼,網(wǎng)盤地址在最下方,獲取教程和案例的資料。 前言 好的學(xué)習(xí)方法可以事半功倍,好的學(xué)習(xí)路徑可以指明前進(jìn)方向。這篇文章不僅要寫學(xué)習(xí)路徑,還要寫學(xué)習(xí)方法,還要發(fā)資料,干貨滿滿,準(zhǔn)備接招。 網(wǎng)上有很多前端的學(xué)習(xí)路徑文章,大多是知...
摘要:本文主要是我學(xué)習(xí)的筆記,不涉及到原理,只是記錄如何使用。成功的含義取決于方法資源已被提取并在消息正文中傳輸。是請(qǐng)求鏈接到服務(wù)器,服務(wù)器響應(yīng)錯(cuò)誤后服務(wù)器返回瀏覽器的狀態(tài)碼。是指響應(yīng)時(shí)間,開始請(qǐng)求到接收到響應(yīng)開始處理的時(shí)間,單位為。 本文主要是我學(xué)習(xí)ajax的筆記,不涉及到原理,只是記錄如何使用。如果有錯(cuò)歡迎各位大佬指出。提前先轉(zhuǎn)一篇寫的非常全面的博客你真的會(huì)使用XMLHttpReques...
摘要:希望幫助更多的前端愛(ài)好者學(xué)習(xí)。前端開發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開發(fā)工程師當(dāng)你問(wèn)起有關(guān)與時(shí),老司機(jī)們首先就會(huì)告訴你其實(shí)是個(gè)沒(méi)有網(wǎng)絡(luò)請(qǐng)求功能的庫(kù)。 前端基礎(chǔ)面試題(JS部分) 前端基礎(chǔ)面試題(JS部分) 學(xué)習(xí) React.js 比你想象的要簡(jiǎn)單 原文地址:Learning React.js is easier than you think 原文作...
先學(xué)習(xí)阮大神的 數(shù)據(jù)類型和Json格式 一、js中解析JSON的方式 eval() JSON.parse var jsondata = {staff:[{name:小紅,age:16},{name:小明,age:20},{name:小芳,age:18}]} var jsonobj = eval(( + jsondata + )) alert( jsonobj.staff[0].name); s...
摘要:最近在學(xué),剛剛?cè)腴T,用到很多與相關(guān)的交互。也用了挺久的了,想寫一下學(xué)習(xí)筆記來(lái)記錄一下。實(shí)現(xiàn)過(guò)程是的基礎(chǔ),是核心對(duì)象,首先要實(shí)例化一個(gè)對(duì)象進(jìn)行請(qǐng)求,規(guī)定請(qǐng)求的類型以及是否異步處理請(qǐng)求。響應(yīng)服務(wù)器狀態(tài)響應(yīng)服務(wù)器狀態(tài)涉及對(duì)象的三個(gè)重要的屬性。 最近在學(xué)php,剛剛?cè)腴T,用到很多與Ajax相關(guān)的交互。Ajax也用了挺久的了,想寫一下學(xué)習(xí)筆記來(lái)記錄一下。今天先簡(jiǎn)單寫一下原理和過(guò)程。歡迎大家一起探...
閱讀 2810·2023-04-25 23:08
閱讀 1601·2021-11-23 09:51
閱讀 1584·2021-10-27 14:18
閱讀 3127·2019-08-29 13:25
閱讀 2840·2019-08-29 13:14
閱讀 2918·2019-08-26 18:36
閱讀 2204·2019-08-26 12:11
閱讀 824·2019-08-26 11:29