摘要:與不同的是,應該以發送的數據作為請求的主體。有了這些不同的事件支持,開發者可以免去檢查之類的工作,更加的方便。其中事件和事件比較重要。而事件則會為在瀏覽器接收數據期間周期性地觸發。
在上篇筆記中,我們主要談了一些概述和跨域的問題,這一次我們聊聊請求和響應的具體內容。向服務器發起請求
我們在創建了XHR對象后,接著需要用兩個方法來發送請求:open()和send(),這兩個方法有點像賽跑前的兩個步驟:預備、跑。在open()中,并沒有實際發送請求,只是一個“預備”動作,真正的發送要到send()中了。
open和sendopen()可以傳遞三個參數:
method:請求的類型,GET或POST之類;
url:文件在服務器的位置;
async:同步或是異步,默認異步,當選擇默認時,我們可以選擇不填這個參數。
send()的參數只有一個,是運用在post方式的請求中,以string的形式。
以下是一個例子:
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和post
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頭部信息每個HTTP請求都帶有頭信息,所以我們發送一個AJAX請求時,實際上也會發送相關的頭信息。默認情況下,下列的頭信息會被發送出去:
Accept;
Accept-Charset;
Accept-Ending;
Accept-Language;
Connection;
Cookie;
Host;
Refer;
User-Agent;
使用setRequestHeader()可以設置自定義的頭信息。這個方法接收兩個參數:頭部字段的名稱和值。例如:
xhr.setRequestHeader("Content-type","application/x-www-form-urlcoded"); xhr.setRequestHeader("MyHeader","MyValue");
要注意的是:setRequestHeader方法需要在open()和send()中間設置,這樣才能成功發送請求的頭部信息。
服務器響應當我們發送請求后,一切順利,服務器也順利發回了響應,那么我們要怎么來獲取這些響應呢?
responseText和responseXML這是獲取兩種不同格式的響應,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 2級XHR的發展也促使W3C著手制定更為完善的2級規范。在這套規范里,有一些內容需要了解。
FormData為了實現表單數據的序列化,在Web應用中更方便地傳輸數據,2級規范定義了FormData類型。
下面是一個創建FormData實例的例子:
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個事件:
loadstart;
progress;
error;
abort;
load;
loadend;
每個瀏覽器所支持的事件不完全相同,比如IE8就支持load事件。有了這些不同的事件支持,開發者可以免去檢查readyState之類的工作,更加的方便。
其中load事件和progress事件比較重要。load事件會在接收到完整的響應數據時觸發,因此我們就不需要再檢查readyState屬性了,只要確保XHR的status為200就可以了。
而progress事件則會為XHR在瀏覽器接收數據期間周期性地觸發。在觸發時,它會額外地提供三個屬性:
lengthComputable;表示進度信息是否可用
position;表示已經接收的字節數
totalSize;表示響應頭確定的預期字節數
有了這些信息,我們可以創造一個進度指示器:
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事件處理程序。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92857.html
摘要:網上有很多前端的學習路徑文章,大多是知識點羅列為主或是資料的匯總,數據量讓新人望而卻步。天了解一個前端框架。也可以關注微信公眾號曉舟報告,發送獲取資料,就能收到下載密碼,網盤地址在最下方,獲取教程和案例的資料。 前言 好的學習方法可以事半功倍,好的學習路徑可以指明前進方向。這篇文章不僅要寫學習路徑,還要寫學習方法,還要發資料,干貨滿滿,準備接招。 網上有很多前端的學習路徑文章,大多是知...
先學習阮大神的 數據類型和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...
閱讀 2797·2023-04-25 23:08
閱讀 1583·2021-11-23 09:51
閱讀 1564·2021-10-27 14:18
閱讀 3115·2019-08-29 13:25
閱讀 2831·2019-08-29 13:14
閱讀 2895·2019-08-26 18:36
閱讀 2193·2019-08-26 12:11
閱讀 811·2019-08-26 11:29