摘要:用于從網(wǎng)絡(luò)上獲取數(shù)據(jù),有了對(duì)象,就可以實(shí)現(xiàn)頁(yè)面的無(wú)刷新請(qǐng)求數(shù)據(jù),就可以做到一個(gè)局部的更新,也可以獲取多種類(lèi)型的數(shù)據(jù)文件。這篇文章主要是分享了中對(duì)象的基本屬性和方法從實(shí)例化初始化發(fā)送和接受四個(gè)階段完成了網(wǎng)絡(luò)請(qǐng)求核心內(nèi)容封裝。
1:基本概念
jQuery的Ajax請(qǐng)求實(shí)際上是封裝的一個(gè)XHLHttpRequest,從字面意思來(lái)看是,XML是一種文件格式,Http是一個(gè)網(wǎng)絡(luò)請(qǐng)求,Request最開(kāi)始是用于請(qǐng)求XML文件的,后來(lái)不斷擴(kuò)展可以請(qǐng)求多種類(lèi)型的文件。
XHLHttpRequest,網(wǎng)絡(luò)請(qǐng)求模塊,或者是一個(gè)瀏覽器網(wǎng)絡(luò)線程。用于從URL網(wǎng)絡(luò)上獲取數(shù)據(jù),有了對(duì)象,就可以實(shí)現(xiàn)頁(yè)面的無(wú)刷新請(qǐng)求數(shù)據(jù),就可以做到一個(gè)局部的更新,也可以獲取多種類(lèi)型的數(shù)據(jù)(ftp、文件)。
2:要實(shí)現(xiàn)和使用XMLHttpRequest它是一個(gè)對(duì)象,首先我們需要實(shí)例化,定義一個(gè):
var xhr = new XMLHttpRequest();3:初始化請(qǐng)求,給定一些必要的配置,給它一些property
//Ajax請(qǐng)求時(shí)的參數(shù)設(shè)置 method 請(qǐng)求方式 url 請(qǐng)求地址 async 是否異步 user 用戶名 password 密碼 xhr.open(method,url,async,user,password);4:發(fā)送請(qǐng)求(encodeURLComponent)
xhr.send(data); 等待接收5:接收網(wǎng)絡(luò)請(qǐng)求返回
一般有如下屬性:
responseText,請(qǐng)求返回的數(shù)據(jù)內(nèi)容,可以是一段文本,是一段二進(jìn)制或者是一個(gè)json
responseXML,是一個(gè)文件,如果響應(yīng)頭內(nèi)容是text/xml,這個(gè)屬性將保留響應(yīng)數(shù)據(jù)的XML、DOM文檔。
status,響應(yīng)的HTTP狀態(tài),如 200(正常,200-300之間都表示成功) 304(使用緩存) 404(沒(méi)找到) 500(服務(wù)器內(nèi)部錯(cuò)誤)等
statusText,HTTP狀態(tài)說(shuō)明
readyStatus,請(qǐng)求/響應(yīng)過(guò)程的當(dāng)前活動(dòng)階段,一共有5個(gè)值:0(未被調(diào)用open),1(已被調(diào)用open但未發(fā)送),2(已調(diào)用send),3(已接收到請(qǐng)求返回的數(shù)據(jù)),4(請(qǐng)求已完成)。
timeout,設(shè)置請(qǐng)求超時(shí)時(shí)間
xhr.onreadystatechange = () => { if (xhr.readyStatus === 4) { /* HTTP 狀態(tài)在 200-300 之間表示請(qǐng)求成功 */ /* HTTP 狀態(tài)為 304 表示請(qǐng)求內(nèi)容未發(fā)生改變,可直接從緩存中讀取 */ if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) { console.log("請(qǐng)求成功", xhr.responseText) } } }6:封裝(promise)
function ajax (options) { /* 獲取請(qǐng)求地址 */ let url = options.url; /* 獲取請(qǐng)求方法 */ const method = options.method.toLocaleLowerCase() || "get"; /* 默認(rèn)異步 */ const async = options.async != false; /* 獲取請(qǐng)求request數(shù)據(jù) */ const data = options.data; /* 實(shí)例化XMLHttpRequest */ const xhr = new XMLHttpRequest(); /* 設(shè)置超時(shí)時(shí)間 */ if (options.timeout && options.timeout > 0) { xhr.timeout = options.timeout } return new Promise ( (resolve, reject) => { /* 添加超時(shí)回調(diào) */ xhr.ontimeout = () => reject && reject("請(qǐng)求超時(shí)"); /* 成功回調(diào) */ xhr.onreadystatechange = () => { if (xhr.readyState == 4) { if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) { resolve && resolve(xhr.responseText); } else { reject && reject(); } } } /* 失敗回調(diào) */ xhr.onerror = err => reject && reject(err); /* 拼接參數(shù) */ let paramArr = []; let encodeData; if (data instanceof Object) { for (let key in data) { paramArr.push( encodeURIComponent(key) + "=" + encodeURIComponent(data[key]) ); } encodeData = paramArr.join("&"); } /* get請(qǐng)求 */ if (method === "get") { const index = url.indexOf("?") if (index === -1) url += "?" else if (index !== url.length -1) url += "&" url += encodeData } /* 初始化請(qǐng)求 */ xhr.open(method, url, async); /* get直接發(fā)送拼接的URL */ if (method === "get") xhr.send(null); if (method === "post") { xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8") xhr.send(encodeData) } }) }
總結(jié):
關(guān)于網(wǎng)絡(luò)請(qǐng)求,一般常用的有四種:
一個(gè)是get,獲取網(wǎng)絡(luò)資源
然后是post,一般用于提交數(shù)據(jù),提交數(shù)據(jù)的參數(shù)是放在請(qǐng)求的body里面的
delete,刪除
put,標(biāo)準(zhǔn)的一個(gè)修改
關(guān)于Http的簡(jiǎn)單請(qǐng)求和非簡(jiǎn)單請(qǐng)求或者是跨域,在跨域時(shí)由于瀏覽器的安全機(jī)制,涉及到一個(gè)問(wèn)題關(guān)于在Ajax請(qǐng)求 ,是在請(qǐng)求之后還是請(qǐng)求之前判斷跨域,這時(shí)候就需要了解一下簡(jiǎn)單請(qǐng)求和復(fù)雜請(qǐng)求。
簡(jiǎn)單請(qǐng)求是先把資源請(qǐng)求回來(lái),然后再去判斷是否跨域。如果是一個(gè)復(fù)雜請(qǐng)求,瀏覽器會(huì)先去發(fā)送一個(gè)嗅探或者是欲請(qǐng)求(一般是一個(gè)option),先判斷是否跨域,如果不是跨域那就執(zhí)行,如果是跨域那就直接不請(qǐng)求了。一般來(lái)講,如果get不修改它的Content-Type,那么基本上都是簡(jiǎn)單請(qǐng)求。post如果采用www-form的形式,也是一個(gè)簡(jiǎn)單請(qǐng)求。
這篇文章主要是分享了Javascript中XMLHttpRequest對(duì)象的基本屬性和方法, 從實(shí)例化、初始化、發(fā)送和接受四個(gè)階段完成了Ajax網(wǎng)絡(luò)請(qǐng)求核心內(nèi)容封裝。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/106321.html
摘要:為這些回調(diào)函數(shù)分別命名并分離存放可以在形式上減少嵌套,使代碼清晰,但仍然不能解決問(wèn)題。如果在一個(gè)結(jié)束成功或失敗,同前面的說(shuō)明后,添加針對(duì)成功或失敗的回調(diào),則回調(diào)函數(shù)會(huì)立即執(zhí)行。 異步? 我在很多地方都看到過(guò)異步(Asynchronous)這個(gè)詞,但在我還不是很理解這個(gè)概念的時(shí)候,卻發(fā)現(xiàn)自己常常會(huì)被當(dāng)做已經(jīng)很清楚(* ̄? ̄)。 如果你也有類(lèi)似的情況,沒(méi)關(guān)系,搜索一下這個(gè)詞,就可以得到大致...
摘要:作者后臺(tái)使用的是語(yǔ)言,所以這里以后臺(tái)為例子不影響學(xué)習(xí)一原生使用方法創(chuàng)建對(duì)象兼容處理處理低版本不兼容問(wèn)題準(zhǔn)備發(fā)送請(qǐng)求方式接口參數(shù)名參數(shù)值異步執(zhí)行發(fā)送回調(diào)是表示數(shù)據(jù)解析完成,后臺(tái)處理完成了。是表示處理的結(jié)果是的。 作者后臺(tái)使用的是php語(yǔ)言,所以這里以php后臺(tái)Api為例子,不影響學(xué)習(xí)Ajax 一、 javaScript原生使用Ajax 1.get方法 //1.創(chuàng)建對(duì)象 兼容處理 var ...
摘要:在這里講解一下用原生如何實(shí)現(xiàn)。當(dāng)然,前面也說(shuō)過(guò),你可以給定固定回調(diào)函數(shù)名最后我已經(jīng)將和請(qǐng)求合并在一起了,下載鏈接原文鏈接原生實(shí)現(xiàn)如有問(wèn)題,歡迎在下方留言 相信大多數(shù)前端開(kāi)發(fā)者在需要與后端進(jìn)行數(shù)據(jù)交互時(shí),為了方便快捷,都會(huì)選擇JQuery中封裝的AJAX方法,但是有些時(shí)候,我們只需要JQuery的AJAX請(qǐng)求方法,而其他的功能用到的很少,這顯然是沒(méi)必要的。 其實(shí),原生JavaScript...
摘要:希望幫助更多的前端愛(ài)好者學(xué)習(xí)。前端開(kāi)發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開(kāi)發(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 原文作...
摘要:所以說(shuō),我們所看到的微博頁(yè)面的真實(shí)數(shù)據(jù)并不是最原始的頁(yè)面返回的,而是后來(lái)執(zhí)行后再次向后臺(tái)發(fā)送了請(qǐng)求,拿到數(shù)據(jù)后再進(jìn)一步渲染出來(lái)的。結(jié)果提取仍然是拿微博為例,我們接下來(lái)用來(lái)模擬這些請(qǐng)求,把馬云發(fā)過(guò)的微博爬取下來(lái)。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---34、數(shù)據(jù)存儲(chǔ):非關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ):Redis下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---36、分析Ajax爬取今日頭條街拍美圖 ...
閱讀 2273·2023-04-25 23:15
閱讀 1934·2021-11-22 09:34
閱讀 1560·2021-11-15 11:39
閱讀 964·2021-11-15 11:37
閱讀 2161·2021-10-14 09:43
閱讀 3500·2021-09-27 13:59
閱讀 1510·2019-08-30 15:43
閱讀 3471·2019-08-30 15:43