摘要:狀態(tài)表示對象的狀態(tài)狀態(tài)描述未初始化。表示成功,表示未找到,表示服務(wù)器內(nèi)部錯誤等。前提是瀏覽器必須支持這個功能,而且服務(wù)器端必須同意這種跨域。事件傳輸成功完成。
系列文章
關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)
關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest
關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(二) ----- File
關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(三) ----- FormData
關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(四) ----- FileReader
關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(五) ----- H5拖拽事件
關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(六) ----- 圖片上傳,旋轉(zhuǎn),重繪,預(yù)覽等實(shí)戰(zhàn)(附DEMO)
XMLHttpRequest 對象用于在后臺與服務(wù)器交換數(shù)據(jù)。您能夠:
在不重新加載頁面的情況下更新網(wǎng)頁
在頁面已加載后從服務(wù)器請求/接收數(shù)據(jù)
在后臺向服務(wù)器發(fā)送數(shù)據(jù)
并且所有現(xiàn)代的瀏覽器都支持 XMLHttpRequest 對象。(簡直程序員的夢想ヾ(≧O≦)〃嗷~)
一如既往先看兼容性
因?yàn)樗鞋F(xiàn)代瀏覽器 (IE7+、Firefox、Chrome、Safari 以及 Opera) 都內(nèi)建了 XMLHttpRequest 對象。創(chuàng)建 XMLHttpRequest 對象只需要這樣
var xmlhttp=new XMLHttpRequest();
舊的瀏覽器也有辦法拯救!!!
var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); // 括號里面的是ActiveX插件的名字.客服端請求 open(string method, string url, boolean asynch, String username, string password):
參數(shù) | 描述 |
---|---|
Method | 表示http請求方法,一般使用"GET","POST" |
url | 表示請求的服務(wù)器的地址 |
asynch | 表示是否采用異步方法,true為異步表示腳本會在 send() 方法之后繼續(xù)執(zhí)行,而不等待來自服務(wù)器的響應(yīng)。false為同步可以省去額外的 onreadystatechange 代碼。如果在請求失敗時是否執(zhí)行其余的代碼無關(guān)緊要,那么可以使用這個參數(shù) |
username(可以不指定) | 提供http認(rèn)證機(jī)制需要的用戶名 |
password(可以不指定) | 提供http認(rèn)證機(jī)制需要的密碼 |
獲取指定的相應(yīng)頭部信息
setRequestHeader(name,value)自定義HTTP頭部信息。需在open()方法之后和send()之前調(diào)用,才能成功發(fā)送請求頭部信息。
頭部 | 描述 |
---|---|
Accept | 瀏覽器能夠處理的媒體類型 |
Accept-Charset | 瀏覽器申明自己接收的字符集 |
Accept-Encoding | 瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate) |
Host | 客戶端指定要請求的WEB服務(wù)器的域名/IP 地址和端口號 |
Referer | 發(fā)出請求的頁面的URI |
Content-Type | 標(biāo)明發(fā)送或者接收的實(shí)體的MIME類型 |
X-Requested-With | 非標(biāo)準(zhǔn)HTTP頭,只為firefox3標(biāo)注是否為ajax異步請求,null表示為同步請求 |
向服務(wù)器發(fā)出請求,如果采用異步方式,該方法會立即返回。content可以指定為null表示不發(fā)送數(shù)據(jù),其內(nèi)容可以是DOM對象,輸入流或字符串。
abort()調(diào)用此方法可取消異步請求,調(diào)用后,XHR對象停止觸發(fā)事件,不允許訪問任何與響應(yīng)相關(guān)的屬性;
服務(wù)端響應(yīng) onreadystatechange事件可以傳遞一個函數(shù)的名稱,當(dāng) XMLHttpRequest 對象的狀態(tài)發(fā)生改變時,會觸發(fā)此函數(shù)。狀態(tài)從 0 (uninitialized) 到 4 (complete) 進(jìn)行變化. 事件使代碼復(fù)雜化了。但是這是在沒有得到服務(wù)器響應(yīng)的情況下,防止代碼停止的最安全的方法。
readyState狀態(tài)表示XMLHttpRequest對象的狀態(tài):
狀態(tài) | 描述 |
---|---|
0 | 未初始化。對象已創(chuàng)建,未調(diào)用open |
1 | open方法成功調(diào)用,但send方法未調(diào)用 |
2 | send方法已經(jīng)調(diào)用,尚未開始接受數(shù)據(jù) |
3 | 正在接受數(shù)據(jù)。Http響應(yīng)頭信息已經(jīng)接受,但尚未接收完成 |
4 | 完成,即響應(yīng)數(shù)據(jù)接受完成 |
表示服務(wù)器返回的http狀態(tài)碼。200表示“成功”,404表示“未找到”,500表示“服務(wù)器內(nèi)部錯誤”等。
總的來說有幾部分:
狀態(tài) | 描述 |
---|---|
1xx | 信息提示 |
2xx | 成功 |
3xx | 重定向 |
4xx | 客戶端錯誤 |
5xx | 服務(wù)器錯誤 |
詳情查閱請狠狠地點(diǎn)擊服務(wù)器返回的各種HTTP狀態(tài)碼介紹
responseText信息服務(wù)器響應(yīng)的文本內(nèi)容.
responseXML對象服務(wù)器響應(yīng)的XML內(nèi)容對應(yīng)的DOM對象.
statusText服務(wù)器返回狀態(tài)的文本信息。
responseBody(只有微軟的IE支持)將響應(yīng)信息正文以unsigned byte數(shù)組形式返回(二進(jìn)制數(shù)據(jù)).
responseStream(只有IE的某些版本支持)以Ado Stream對象(二進(jìn)制流)的形式返回響應(yīng)信息.
getResponseHeader(name)從響應(yīng)信息中獲取指定的http頭.
getAllResponseHeaders獲取響應(yīng)的所有http頭.
overrideMimeType通常用于重寫服務(wù)器響應(yīng)的MIME類型。
Eg,正常情況下XMLHttpRequest只接收文本數(shù)據(jù),但我們可以重寫MIME為“text/plain; charset=x-user-defined”,以欺騙瀏覽器避免瀏覽器格式化服務(wù)器返回的數(shù)據(jù),以實(shí)現(xiàn)接收二進(jìn)制數(shù)據(jù)。
下面基本跟來源教程一樣,只是部分寫法有點(diǎn)區(qū)別
var xmlhttp; function loadXMLDoc(url) { if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest() } else if (window.ActiveXObject) { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP") } else { xmlhttp = null; alert("Your browser does not support XMLHTTP."); } if (xmlhttp) { xmlhttp.onreadystatechange = state_Change; xmlhttp.open("GET", url, true); xmlhttp.send(null); } //post /*if(xmlhttp) { xmlhttp.onreadystatechange = state_Change; xmlhttp.open(""POST"", url); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlhttp.send(null); }*/ } function state_Change() { if (xmlhttp.readyState === 4) { // 4 = "loaded" if (xmlhttp.status === 200) { // 200 = OK // ...our code here... } else { alert("Problem retrieving XML data"); } } }
看著挺強(qiáng)大,實(shí)際還是有挺多缺點(diǎn)的,例如:
只支持文本數(shù)據(jù)的傳送,無法用來讀取和上傳二進(jìn)制文件。
傳送和接收數(shù)據(jù)時,沒有進(jìn)度信息,只能提示有沒有完成。
受到"同域限制"(Same Origin Policy),只能向同一域名的服務(wù)器請求數(shù)據(jù)。
于是后面就有了新版本.
XMLHttpRequest2 對象新版本針對以前的缺點(diǎn)升級的新增功能主要有以下:
可以設(shè)置 HTTP 請求的時限。(部分瀏覽器兼容有問題)
可以使用 FormData 對象管理表單數(shù)據(jù)。(后續(xù)文章會講到)
下載和上載圖像、視頻和音頻等二進(jìn)制文件(無需使用插件)。(其實(shí)整個系列文章都是圍繞這個需求才得出的)
可以請求不同域名下的數(shù)據(jù)(跨域請求)。(前提是瀏覽器必須支持這個功能,而且服務(wù)器端必須同意這種"跨域"。前端代碼的寫法與不跨域的請求完全一樣。)
可以獲取服務(wù)器端的二進(jìn)制數(shù)據(jù)。
可以獲得數(shù)據(jù)傳輸?shù)倪M(jìn)度信息:
timeout設(shè)置ajax請求超時時限,過了這個時限,就自動停止 HTTP 請求。
responseType(默認(rèn):“text”)在發(fā)送請求前,根據(jù)您的數(shù)據(jù)需要,將xhr.responseType設(shè)置為“text”、“arraybuffer”、“blob”或“document”。(暫時不講)
response: 響應(yīng)成功發(fā)送請求后,xhr的響應(yīng)屬性會包含DOMString、ArrayBuffer、Blob 或 Document 形式(具體取決于responseTyp的設(shè)置)的請求數(shù)據(jù)。
progress傳送數(shù)據(jù)的時候,用來返回進(jìn)度信息。它分成上傳和下載兩種情況:
上傳的progress事件屬于XMLHttpRequest.upload對象
下載的progress事件屬于XMLHttpRequest對象
里面有兩個重要屬性分別是
total:需要傳輸?shù)目傋止?jié),
loaded:已經(jīng)傳輸?shù)淖止?jié)。
(大家都應(yīng)該猜到這就是實(shí)現(xiàn)進(jìn)度條的東西了)
ontimeout事件當(dāng)ajax超過timeout 時限時觸發(fā)的回調(diào)函數(shù)。
load事件:傳輸成功完成。
error事件:傳輸中出現(xiàn)錯誤。
loadstart():傳輸開始。
loadEnd():傳輸結(jié)束,但是不知道成功還是失敗。
修改版還以上面的代碼示例修改一下
var xmlhttp; function loadXMLDoc(url) { if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest() } else if (window.ActiveXObject) { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP") } else { xmlhttp = null; alert("Your browser does not support XMLHTTP."); } if (xmlhttp) { xmlhttp.timeout = 3000; xmlhttp.ontimeout = time_Out; xmlhttp.onreadystatechange = state_Change; xmlhttp.upload.onprogress = load_Change;//未經(jīng)測試 xmlhttp.open("GET", url, true); xmlhttp.send(null); } } function time_Out() { alert("請求超時!"); } function state_Change() { if (xmlhttp.readyState === 4) { // 4 = "loaded" if (xmlhttp.status === 200) { // 200 = OK // ...our code here... } else { alert("Problem retrieving XML data"); } } } function load_Change(evt) { if (evt.lengthComputable) { var percentComplete = Math.round(evt.loaded * 100 / evt.total); xx.value = percentComplete; xx.style.width = percentComplete + "%"; } }
實(shí)戰(zhàn)需要后臺代碼配合,詳情查閱請狠狠地點(diǎn)擊關(guān)于XMLHttpRequest 對象
load_Change函數(shù)寫著未經(jīng)測試是需要傳送后臺返回數(shù)據(jù)才能拿到,我暫時沒辦法測試,只是給個思路給你們實(shí)現(xiàn)進(jìn)度條,參考網(wǎng)上其他文章然后加進(jìn)去的,有興趣可以自行搜索,沒興趣就忽略吧,怕誤人子弟就不好了(據(jù)說部分手機(jī)不支持),里面的evt一般是這樣子的
詳情查閱請狠狠地點(diǎn)擊原生js上傳文件 顯示進(jìn)度條
實(shí)話實(shí)說,這章看起來內(nèi)容好少比較簡單,其實(shí)你被誤導(dǎo)了,是我寫的簡單了,實(shí)際有好多東西都沒寫出來,因?yàn)槲乙策€在摸索沒太搞懂,想做出一個完整實(shí)例需要后端配合能力,這是硬傷,我還沒到這水平,就是讓大家知道有這么一個東西,建議大家網(wǎng)上查看其它資料.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/106269.html
摘要:如果是傳入三個參數(shù)的方式,那么該值將是一個布爾值,文件,或者一個,如果不是,將被轉(zhuǎn)成一個字符串可選傳給服務(wù)器的文件名稱一個。 系列文章 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(二) ----- File關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(三) ----- FormData關(guān)于前端上傳文...
摘要:為了解救上面說到的問題是向提交的一個草案,旨在推出一套標(biāo)準(zhǔn)的,其基本功能是實(shí)現(xiàn)用對本地文件進(jìn)行操作。出于安全性的考慮,該只對本地文件提供有限的訪問。 系列文章 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(二) ----- File關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(三) ----- For...
摘要:在中,拖放是標(biāo)準(zhǔn)的一部分,任何元素都能夠拖放。如果需要設(shè)置允許放置,我們必須阻止對元素的默認(rèn)處理方式方法。 系列文章 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(二) ----- File關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(三) ----- FormData關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(...
摘要:表單用于向服務(wù)器傳輸數(shù)據(jù)。屬性對象的屬性指定了一個事件句柄函數(shù)。標(biāo)簽的屬性應(yīng)當(dāng)與相關(guān)元素的屬性相同。詳情查閱請狠狠地點(diǎn)擊關(guān)于對象代表表單中的一個提交按鈕在表單提交之前,觸發(fā)事件句柄,并且一個句柄可以通過返回來取消表單提交。 系列文章 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(二) -...
閱讀 4548·2021-09-10 11:22
閱讀 529·2019-08-30 11:17
閱讀 2563·2019-08-30 11:03
閱讀 430·2019-08-29 11:18
閱讀 3454·2019-08-28 17:59
閱讀 3218·2019-08-26 13:40
閱讀 3157·2019-08-26 10:29
閱讀 1136·2019-08-26 10:14